【问题标题】:trailing return type in template class (contradiction between GNU and Microsoft compilers)模板类中的尾随返回类型(GNU 和 Microsoft 编译器之间的矛盾)
【发布时间】:2013-08-16 23:45:20
【问题描述】:

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

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

【问题讨论】:

  • C++14 中自动推导的返回类型解决了这个问题。
  • 我的直觉表明两者都应该是有效的。再说一次,这我们正在谈论的C++......
  • 请注意,上面没有理由使用尾随返回类型。
  • @BillyONEal 是的。我敢肯定在很多情况下都需要尾随返回类型,例如f 中涉及的模板
  • @a.lasram:据我了解,这就是将它们添加到语言中的原因。虽然我敢打赌declval 减轻了对大多数情况的需求。

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


【解决方案1】:

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

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

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

std::declval&lt;&gt;()&lt;utility&gt; 中声明。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多