【发布时间】:2018-01-05 08:23:50
【问题描述】:
我发现decltype 内部的表达式处理成功,而decltype 外部的相同表达式给出错误:see on Godbolt。
我正在检查给定类型 (operator <<) 是否存在输出到流的过载 - 通过使用 decltype 和类型特征。但是对于来自 GCC decltype 的 libstdc++,即使在没有这种重载的情况下也会返回正确的类型。
我用 libc++ 尝试了 Clang - 没有这样的问题。试过 GCC 7.1 - 没问题。但是,如果我尝试使用 GCC
基本上:
class Foo {};
...
decltype(std::declval<std::ostringstream>() << std::declval<Foo>()) // gives std::ostringstream&
...
Foo foo;
std::ostringstream out;
out << foo; // gives an error (as it should, there is no overload for Foo)
那么,为什么会这样,libstdc++ 出了什么问题?
【问题讨论】:
-
每种情况下使用哪个 C++ 版本? (如果不强制使用 --std= 标志,默认使用哪个版本?),可能响应不同,因为每个编译器默认使用不同版本的 C++。
-
正如您在 Godbolt 上看到的,我在所有情况下都使用 -std=c++14 标志。