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

时间:2016-08-25 22:37:31

标签: 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()都是未评估的上下文,因此我不确定其区别。

1 个答案:

答案 0 :(得分:4)

这是一个编译错误。

围绕它的解决方案是在表达式周围使用"$ sed 's/define('\''TARGET_A'\'','\''044'\'');/define('\''TARGET_K'\'','\''076'\'');/' file define('TARGET_K','076'); decltype()(在这种情况下都是非多态 - glvalue表达式)都是未评估的上下文,这应该没有区别,这就是导致这个错误的原因。在这里使用decltype()充当一种“未评估的上下文缓冲区”,不知怎的typeid()更喜欢这种情况。

嗯,是时候联系TDM了解。这个错误不是TDM的问题,它是一个香草虫(感谢ildjarn)。