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

标签 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 提示该消息

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/

相关文章:

c - "gcc -DSOMENAME"; "SOMENAME"未定义

c++ - QTimer 在单独的方法中启动时崩溃

c++ - 提取当前可执行文件名称

c++ - 可互换声明的变量具有相同的内存地址模式

c++ - Visual Studio 2019 找不到很多头文件

c++ - 如何告诉 Inline ASM 变量是十六进制的

c - 将链表节点插入升序单链表GCC错误: dereferencing pointer to incomplete type

c++ - 如何监视 C++ 中文件的目录?

c - 内联 (x86) 汇编如何影响程序流程?

c++ - 为什么 GCC 4.8.2 不传播 'unused but set' 优化?