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

Posted

技术标签:

【中文标题】无法在 TDM-GCC 的 typeid 中使用 declval【英文标题】:Unable to use declval in typeid for TDM-GCC 【发布时间】:2016-08-25 22:37:31 【问题描述】:

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

【问题讨论】:

试试typeid(decltype(std::declval&lt;Foo&gt;().func())); 啊,这行得通!想知道为什么会这样…… 来自cppreference:“如果expression 不是多态类型的左值表达式,typeid 不会计算表达式[.]”。我在考虑编译器错误。 @Quentin : Yup – "如果表达式不是多态类型的左值表达式,typeid 不会计算表达式,它标识的 std::type_info 对象表示表达式。" 与 decltype 完全一样,修复了它。 @Quentin :这正是我要说的完全 - 使用decltype,它有效,应该在语义上与“版本2”相同,但它没有。 “是”的意思是“是的,绝对是编译器错误。” 【参考方案1】:

这是一个编译器错误。

解决方法是在表达式周围使用decltype()decltype()typeid() (在这种情况下是非多态glvalue 表达式)都是未评估的上下文,这不应该产生影响,这就是导致此错误的原因。在这里使用decltype() 充当一种“未评估的上下文缓冲区”,不知何故typeid() 更喜欢这个。

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

【讨论】:

这个错误repros on upstream GCC,尽管表现形式不同。看起来编译器正在尝试评估std::declval,从而在确定它在未评估的上下文中运行之前导致错误,这不会导致错误。 (啊,我喜欢 C++。)无论如何,我认为 TDM 在这里没有任何作用。

以上是关于无法在 TDM-GCC 的 typeid 中使用 declval的主要内容,如果未能解决你的问题,请参考以下文章

由于 typeid().raw_name(),c++ 代码无法使用 GCC 编译 - 我该如何解决这个问题?

typeinfo / typeid 输出

HiveError:无法读取,未知 typeId:32。您是不是忘记注册适配器?

这是我的devcpp界面,想请教一下 截图右边的 TDM-gcc ……好几种选择,具体有啥区别?

matlab-bgl 工具包配置环境 TDM-GCC-64 mex

dev调试