编译器: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()
都是未评估的上下文,所以我不确定有什么区别。