c++ - 无法在 TDM-GCC 的 typeid 中使用 declval

标签 c++ c++14 typeid tdm-gcc

编译器:TDM-GCC-5.1.0(SJLJ 展开)

我在玩 declval 时发现我无法在它应该工作的上下文中使用它:作为 typeid() 的参数。

在以下代码中,我将 declval 用于其主要用例之一:无需通过实例即可获取方法的返回类型。我得到的错误是 declval 的 static_assert 消息,但这应该是不可能的,因为在这种情况下 typeid() 不会评估它的参数:

#include <typeinfo>
#include <utility>

struct Foo
{
    int func();
};

int main()
{
    typeid(std::declval<Foo>().func());
}

这不会为我编译(当使用 -std=c++14 编译时)。我唯一的猜测是我发现了一个编译器错误,或者我做了一些明显错误的事情但我看不到它。如果是后者,我很抱歉。

编辑: 感谢ildjarn的帮助,解决方法是使用decltype,所以最后一行代码变成:

typeid(decltype(std::declval<Foo>().func()));

这很好用。然而,现在我的问题变成了:怎么会这样? typeid()decltype() 都是未计算的上下文,所以我不确定有什么区别。

最佳答案

这是一个编译器错误。

围绕它的解决方案是在表达式周围使用 decltype()decltype()typeid()(在本例中是非多态泛左值表达式)都是未求值的上下文,它们应该没有区别,这就是使这是一个错误。在这里使用 decltype() 充当一种“未评估的上下文缓冲区”,而且 typeid() 更喜欢这个。

好吧,是时候联系 TDM 了。这个错误不是 TDM 的问题,它是一个普通的错误(感谢 ildjarn)。

关于c++ - 无法在 TDM-GCC 的 typeid 中使用 declval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39155807/

相关文章:

c++贝塞尔曲线切线方向问题

c++ - 线程同步 C++

c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?

c++ - 通过 lambda 部分特化类模板

c++ - 创建一个类型为 'this'/current object 的指针

c++ - type_info 指针可以用来区分 C++ 中的类型吗?

c++ - typeid 导致不同的编译器

c++ - 如何在 C++ 类中定义 vector <ifstream>

c++ - Tokyo Cabinet : Segmentation fault at hdb->close()

c++ - 如何让 clang 3.4 编译通用 lambdas?