无法在typeid中使用declval用于TDM-GCC

Pau*_*ich 6 c++ typeid c++14 tdm-gcc

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

我一直在玩declval,我注意到我无法在它应该工作的环境中使用它:作为参数typeid().

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

#include <typeinfo>
#include <utility>

struct Foo
{
    int func();
};

int main()
{
    typeid(std::declval<Foo>().func());
}
Run Code Online (Sandbox Code Playgroud)

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

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

typeid(decltype(std::declval<Foo>().func()));
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,现在我的问题变成了:怎么样?这两个typeid()decltype()是未评估的背景,所以我不知道有什么区别.

Pau*_*ich 4

这是一个编译器错误。

解决方案是使用decltype()around 表达式。和(在这种情况下是非多态泛左值表达式)都是未评估的上下文,这不应该产生影响,这就是导致此错误的原因decltype()typeid()在这里使用decltype()充当一种“未评估的上下文缓冲区”,并且不知何故typeid()更喜欢这个。

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