2

以下代码在 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' : 只能在非静态成员函数中引用

知道在这两种情况下我做错了什么吗?

4

1 回答 1

2

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

不过,您可能想尝试以下解决方法:

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

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

于 2013-08-17T00:05:34.953 回答