【发布时间】:2026-01-17 06:20:02
【问题描述】:
typedef decltype(true ? (long&&)0 : (long&&)0) T;
应该是什么?
根据 gcc (4.7),它是 long。根据 clang(主干),它是 long&&。这种差异导致 clang 无法编译使用 gcc 4.7 的 libstdc++ 的代码。谁是对的?
UPDATE:正如 ildjarn 指出的那样,Clang 是正确的,正如 Richard Smith 指出的那样,错误 libstdc++ 是由于错误在标准。这是relevant GCC bug 和relevant Defect Report。
【问题讨论】:
-
这是不是一些涉及
&&的模板代码的简化形式? -
@NicolBolas:是的。这相关吗?
-
我想知道的主要问题是它是否只发生在基本类型上,还是也发生在用户定义的类型上?
-
@NicolBolas:用户定义的类型也会发生这种情况。
-
libstdc++ 包含此错误,原因是 C++ 标准中对 std::common_type 的规范不正确。在 Clang 的“C++ 状态”页面上有一个 libstdc++4.7 的补丁来修复这个错误:clang.llvm.org/cxx_status.html
标签: c++ gcc c++11 clang decltype