以下代码演示了使用三元运算符的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。
来证明答案 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&&
。