我找到了一个案例,当成功处理decltype
内的表达式时decltype
外的同一个表达式出错:see on Godbolt。
我正在检查输出到给定类型(operator <<
)的流是否过载 - 使用decltype
并输入特征。但对于来自GCC的libstdc ++&lt; 7 decltype
即使在没有这种过载的情况下也会返回正确的类型。
我用libc ++尝试过Clang - 没有这样的问题。试过GCC 7.1--没问题。但是,如果我尝试GCC&lt; 7或Clang与来自GCC的libstdc ++&lt; 7 - 出现问题。
基本上:
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 ++出了什么问题?
答案 0 :(得分:2)
std::declval<std::ostringstream&>() << std::declval<T const &>()
// ^ ^^^^^^^^
价值类别很重要。您正在测试将const T
左值流式传输到ostringstream
左值的功能。
在原始代码中,<<
解析为右值流的until-recently-unconstrained <<
重载。没有约束,表达式总是格式良好。