为什么在这种情况下,decltype行为与libstdc ++的正常表达式不同?

时间:2018-01-05 08:23:51

标签: c++ c++11 c++14 libstdc++

我找到了一个案例,当成功处理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 ++出了什么问题?

1 个答案:

答案 0 :(得分:2)

std::declval<std::ostringstream&>() << std::declval<T const &>()
//                             ^                     ^^^^^^^^

价值类别很重要。您正在测试将const T左值流式传输到ostringstream左值的功能。

在原始代码中,<<解析为右值流的until-recently-unconstrained <<重载。没有约束,表达式总是格式良好。