0

次のコードは、1 つの定義規則に違反していませんが、予期しない結果をもたらしています。

Test.hpp

class Test
{
    public:
        int test();
};

Test1.cpp

#include "Test.hpp"

int Test::test()
{
    return 1;
}

int test1() // expected to return 1
{
    Test a = Test();
    return a.test();
}

Test2.cpp

#include "Test.hpp"

inline int Test::test() // doesn't violate ODR
{
    return 99;
}

int test2() // expected to return 99
{
    Test a = Test();
    return a.test();
}

main.cpp

#include <iostream>

int test1();
int test2();

int main()
{
    std::cout << test1() << std::endl;
    std::cout << test2() << std::endl;
}

「1 99」と出力されることを期待していますが、常に「1 1」と出力されます。

Test::test の 2 つの定義については、そのうちの 1 つがインライン定義であるため、One Definition Rule にも違反していません。

したがって、このプログラムは有効ですが、期待される結果が出力されません...

このプログラムに問題はありますか? それとも、ODR ルールについて誤解しているのでしょうか? (C++ 標準への参照が役立ちます)。

4

1 に答える 1