无法在TDM-GCC的typeid中使用声明

Unable to use declval in typeid for TDM-GCC

本文关键字:声明 typeid TDM-GCC      更新时间:2023-10-16

编译器:TDM-GCC-5.1.0 (SJLJ unwinding)

我正在玩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()(在非多态glvalue表达式的情况下)都是未求值的上下文,这应该不会产生差异,这就是导致此错误的原因。在这里使用decltype()作为一种"未求值的上下文缓冲区",而typeid()不知何故更喜欢这样。

好吧,是时候联系TDM了。

这个bug不是TDM的问题,它是一个普通的bug(感谢ildjarn)