以下代码在 msvc v120(预览编译器)上编译
template<typename T>
struct X
{
int f() const { return 0; }
auto g() -> decltype(f()) const { return f(); }
};
int main()
{
X<int> x;
return 0;
}
gcc 4.8.1 提示该消息
cannot call member function 'int X::f() const without object
将g
更改为
auto g() -> decltype(this->f()) const { return f(); }
解决了 gcc 的问题,但现在 msvc 输出
C2355: 'this' : can only be referenced inside non-static member functions
知道在这两种情况下我做错了什么吗?
最佳答案
首先是另一个数据点:clang 编译原始代码和修改后的版本。我想,但这对你并没有多大帮助。从我的直觉来看,代码应该是正确的,但直觉可能很棘手,我怀疑需要花相当长的时间浏览标准才能告诉你 gcc 和 MSVC++ 都是错误的,而且它也不会对你有太大帮助。
不过,您可能想尝试以下解决方法:
auto g() -> decltype(std::declval<X const>().f()) const { return f(); }
std::declval<>()
声明于 <utility>
.
关于c++ - 模板类中的尾随返回类型(GNU 和 Microsoft 编译器之间的矛盾),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18283612/