6

编译器: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());
}

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

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

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

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

4

1 回答 1

4

这是一个编译器错误。

围绕它的解决方案是decltype()围绕表达式使用。decltype()和(在这种情况下是非多态glvaluetypeid()表达式)都是未评估的上下文,这不应该有什么不同,这就是使它成为错误的原因。在这里使用decltype()充当一种“未评估的上下文缓冲区”,并且不知何故typeid()更喜欢这个。

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

于 2016-08-25T23:10:38.217 回答