模板类中的尾随返回类型(GNU和Microsoft编译器之间的矛盾)

时间:2013-08-16 23:45:20

标签: c++ visual-c++ gcc c++11

以下代码在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抱怨消息

  

无法调用成员函数'int X :: f()const而没有对象

g更改为

auto g() -> decltype(this->f()) const { return f(); }

解决了gcc的问题,但现在msvc输出

  

C2355:'this':只能在非静态成员中引用   功能

知道在任何一种情况下我做错了什么?

1 个答案:

答案 0 :(得分:2)

首先关闭另一个数据点:clang编译原始代码和修改后的版本。我想,这对你来说并没有多大帮助。根据我的直观理解,代码应该是正确的,但直觉可能很棘手,我怀疑浏览标准会花费很长时间告诉你gcc和MSVC ++都是错误的,它也不会帮助你。

您可能希望尝试以下解决方法:

auto g() -> decltype(std::declval<X const>().f()) const { return f(); }

std::declval<>()<utility>中声明。