我使用条件运算符进行了一些测试,以查看具有相同基础类型的两个对象的计算类型(删除引用和cv限定符时的相同类型)。 GCC和clang ++在每个组合中都是一致的(我没有测试volatiles
),除了xvalues:
#include <iostream>
#include <typeinfo>
struct A {};
template<class A>
void print_qualif()
{
using rm_r = std::remove_reference_t<A>;
if (std::is_const<rm_r>::value)
std::cout << "const";
if (std::is_lvalue_reference<A>::value)
std::cout << '&';
else if (std::is_rvalue_reference<A>::value)
std::cout << "&&";
std::cout << " ";
}
#define res(X, Y) print_qualif<decltype(true ? X : Y)>()
A&& x();
A const&& xc();
int&& ix();
int const&& ixc();
int main()
{
res(x(), xc()); // GCC prints const&& and clang const
res(ix(), ixc()); // Both prints const&&
}
谁是对的?我会说GCC就在这里,因为当两个操作数具有相同的值类别和相同的基础类型时,它们会保持结果保持值类别与最合格的cv限定符。