内联构造函数和一个定义规则



考虑以下源文件1.cpp

#include <iostream>
using namespace std;
struct X
{
    X()
    {
        cout << "1" << endl;
    }
};
void bar();
void foo()
{
    X x;
}
int main()
{
    foo();
    bar();
    return 0;
}

2.cpp

#include <cstdio>
struct X
{
    X()
    {
        printf("2n");
    }
};
void bar()
{
    X x;
}

从这些文件编译的程序格式是否正确?它的输出中应该包含什么?

由于违反一个定义规则或输出"12",我预计会出现链接器错误。然而,当使用g++3.4和VC 8.0编译时,它会打印出"11"。
如何解释?

这确实违反了ODR(3.2)-特别是一个内联函数可以有多个定义,但这些定义必须相同(3.2/5)-并导致未定义的行为,因此任何事情都可能发生,编译器/链接器不需要进行诊断。您看到这种行为的最可能原因是函数调用是内联的,并且不参与链接,因此不会发出链接错误。

如果内联函数(如类构造函数)在不同的转换单元中有不同的定义,这是未定义的行为(无需诊断)。

最新更新