C++ 中参数类型之间的私有继承情况下的三元运算符类型选择

Fed*_*dor 7 c++ conditional-operator language-lawyer

E1 ? E2 : E3在不同类型的情况下,C++ 条件(三元)运算符的类型,如果另一个操作数可以唯一地转换为该类型,则选择其中之一E2E3这组规则实际上更复杂,总结在https://en.cppreference.com/w/cpp/language/operator_other#Conditional_operator

在下面的简化程序中,条件运算符的操作数是A和类型的右值B

class A;
struct B {
    B() {}
    B(const A &) {}
};
class A : B {};

int main() {
    void( true ? B{} : A{} );
}
Run Code Online (Sandbox Code Playgroud)

由于A是从 私有派生的B,因此不可能强制转换为父级,但A可以唯一地转换为B使用构造函数B::B(const A &)。并且没有从B到 的演员表A。所以我希望三元运算符的类型B与转换为该类型的最后一个参数相同。事实上,Clang 接受了该计划。

但 GCC 在这里打印错误:

error: 'B' is an inaccessible base of 'A'
Run Code Online (Sandbox Code Playgroud)

演示: https: //gcc.godbolt.org/z/n56vf4qzY

哪个编译器就在这里?