无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
Cannot assign a non-static member function in clang Linux, but I can in Visual Studio Windows?
我有一个非常简单的类,它返回一个字符串:
class Foo
{
public:
const char *GetString() const
{
return "bar";
}
};
我有一个非常简单的类,它包含一个指向GetString的函数指针。
template < class classname >
struct ClassFunctionPointer
{
typedef const char * ( classname::* StringReturner )( void ) const;
StringReturner stringReturnerFnPtr;
};
然后我有了这段代码,它在Windows(Visual Studio(下编译得很好,但在Linux(clang(下编译不好。
ClassFunctionPointer< Foo > fptrs;
fptrs.stringReturnerFnPtr = &(Foo::GetString);
Linux下的错误为:error: call to non-static member function without an object argument
。我不理解这个错误,因为我没有进行函数调用。我只是把函数的地址分配给一个函数指针。
如果我演一个演员也不行:
ClassFunctionPointer< Foo > fptrs;
fptrs.stringReturnerFnPtr = reinterpret_cast< typename ClassFunctionPointer< Foo >::StringReturner >(&(Foo::GetString));
这可以归结为使用括号。让我们生成一个最小的测试用例:
struct Foo
{
int bar();
};
int main()
{
&(Foo::bar);
}
您已表示Visual Studio接受此操作。不应该!
[expr.unary.op/4]:
只有当使用显式&
并且其操作数是不包含在括号中的限定id时,才形成指向成员的指针[注意:也就是说,表达式&(qualified-id)
(限定id括在括号中(不构成"指针到成员"类型的表达式。qualified-id
也不构成,因为没有从非静态成员函数的合格id隐式转换为"指针到会员函数"类型正如从函数类型的左值到类型"指向函数的指针"([conv.func]
(一样。&unqualified-id
也不是指向成员的指针,即使在非限定id的类的范围内也是如此--尾注]
我不知道为什么存在这个规则。
无论如何,我尝试过的GCC的每个版本都会拒绝代码:
错误:无效使用非静态成员函数'int Foo::bar(('
这是一种常见的诊断,表示您忘记了&
或()
。某些编译器的某些版本使用了不同的、更令人困惑的措辞("在没有对象参数的情况下调用非静态成员函数"(
Clang对此表示赞同。
Visual Studio对这类事情过于宽容是很常见的。
既然你希望你的代码是可移植的和符合标准的,那就使用更常见的:
&Foo::GetString
也就是说,删除括号。
- 我可以重新分配/覆盖std::字符串吗
- 为什么我可以使用比分配的内存更多的内存
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 我可以在堆栈上分配`std :: array`阵列,而不知道编译时大小
- 我可以在 Boost.Spirit.Qi 中向列表运算符 (%) 提供内存分配提示吗?
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- 我可以删除对象本身并重新分配它
- 我可以分配给新[]的指针
- 我可以使用std ::分配的分配的原始数组
- 我可以将指针作为指针转向课程,以便我可以使用分配给同类指针的任何内容
- 我可以将 jsoncpp 与动态分配一起使用吗?
- 我可以动态分配以前分配的内存,但用不同的指针分配
- 我可以分配成员访问操作员的返回值吗?
- 我可以将文件描述符的地址分配给变量
- 我可以在不手动将它们分配在堆上的情况下存储iostreams集合
- 我可以在CUDA设备上为包含浮点数数组的对象分配内存吗