物理の駅 by onsanai

Physics Station → PhSt 質問・疑問・間違いの指摘は、コメントに書くか、直接伝えるときっと良いことがあります。主にWindows or Ubuntu用の記事です

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

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

コード協力: 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 となる。