clang和gcc对xvalues条件表达式的类型不一致

时间:2017-10-02 00:54:59

标签: c++ gcc clang c++14 conditional-operator

我使用条件运算符进行了一些测试,以查看具有相同基础类型的两个对象的计算类型(删除引用和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限定符。

0 个答案:

没有答案