无法在 TDM-GCC 的 typeid 中使用 declval
Unable to use declval in typeid for TDM-GCC
编译器:TDM-GCC-5.1.0(SJLJ 展开)
我在玩 declval
并且我注意到我无法在它应该工作的上下文中使用它:作为 typeid()
.
的参数
在下面的代码中,我将 declval
用于其主要用例之一:无需通过实例即可获取方法的 return 类型。我得到的错误是 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()
(在这种情况下是非多态泛左值表达式)都是未计算的上下文,它们应该没有什么区别,这就是导致这个错误的原因。在这里使用 decltype()
相当于 "unevaluated context buffer",而且 typeid()
更喜欢这个。
嗯,是时候联系 TDM 了。这个错误不是 TDM 的问题,它是一个普通的错误(感谢 ildjarn)。
编译器:TDM-GCC-5.1.0(SJLJ 展开)
我在玩 declval
并且我注意到我无法在它应该工作的上下文中使用它:作为 typeid()
.
在下面的代码中,我将 declval
用于其主要用例之一:无需通过实例即可获取方法的 return 类型。我得到的错误是 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()
(在这种情况下是非多态泛左值表达式)都是未计算的上下文,它们应该没有什么区别,这就是导致这个错误的原因。在这里使用 decltype()
相当于 "unevaluated context buffer",而且 typeid()
更喜欢这个。
嗯,是时候联系 TDM 了。这个错误不是 TDM 的问题,它是一个普通的错误(感谢 ildjarn)。