物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

三項演算子の戻り値に基底クラスと派生クラスを入れた場合の挙動

三項演算子の戻り値に基底クラスと派生クラスを入れた場合、派生クラスの型は基底クラスに変換できないため、 どちらからも共通して変換できる基底クラスが戻ってくる 。

コード協力: H氏

#include <iostream>
struct A
{
    int func() const { return 0; }
};
struct B : public A
{
    int func() const { return 1; }
};
int main()
{
    if (true) {
        for (int format = 0; format < 2; format++) {
            A a;
            B b;
            const auto& x = format == 0 ? a : b;
            std::cout << typeid(x).name() << " " << x.func() << std::endl;
        }
    }
    return 0;
}

出力は

struct A 0
struct A 0

となる。つまり、クラス A を入れてもクラス B を入れても、戻ってくる型は A となる。