Fed*_*dor 7 c++ conditional-operator language-lawyer
E1 ? E2 : E3在不同类型的情况下,C++ 条件(三元)运算符的类型,如果另一个操作数可以唯一地转换为该类型,则选择其中之一E2。E3这组规则实际上更复杂,总结在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
哪个编译器就在这里?