三元运算符'?''在4.9.0之前的GCC版本中推导出错误的类型?

时间:2017-07-28 17:15:57

标签: c++ c++11 g++

以下代码演示了使用三元运算符的GCC问题(版本< 4.9.0):

static_assert(std::is_same<int, decltype(true ? std::declval<int>() : std::declval<int>())>::value,
              "Succeeds on GCC < 4.9.0");
static_assert(std::is_same<int&&, decltype(true ? std::declval<int>() : std::declval<int>())>::value, 
              "Succeeds on GCC >= 4.9.0");

第二行是正确的实现,因为(true?int&amp;&amp;:int&amp;&amp;)应该推断出int&amp;&amp;不是int。

这可以通过Godbolt's compiler explorer

来证明

2 个答案:

答案 0 :(得分:1)

这个bug出现在gcc的古老版本中。

这个表达式是原因:

fig = class_counts.plot(kind='bar',  figsize=(20, 16), fontsize=26).get_figure()

fig.savefig('test.pdf')

decltype(true ? std::declval<T>() : std::declval<U>()); 的正确结果是std::declval<T>()

T&&decltype(T&&)因为在这种情况下T&amp;&amp;是一个实体。

答案 1 :(得分:1)

Matt Godbolt's compiler explorer之后,GCC似乎改变了对版本4.9.0之后断言的想法。所以这似乎是一段时间前修复过的错误。

请注意,declval()defined as

template<class T>
typename std::add_rvalue_reference<T>::type declval() noexcept;

所以我希望declval<int>()的返回类型为int&&