MSVC中的ODR错误?

时间:2015-11-05 12:50:42

标签: c++ visual-c++ one-definition-rule

使用MSVC编译时,此程序会打印Mat cvarrToMat(const CvArr* arr, bool copyData=false, bool allowND=true, int coiMode=0 ) 而不是1 1

f1.cpp:

1 2

f2.cpp:

#include <functional>

static std::function<int ()> helper() {
    struct F { int operator()() { return 1; } };
    return F();
}

std::function<int ()> f1() { return helper(); }

main.cpp中:

#include <functional>

static std::function<int ()> helper() {
    struct F { int operator()() { return 2; } };
    return F();
}

std::function<int ()> f2() { return helper(); }

好像#include <functional> #include <iostream> std::function<int ()> f1(); std::function<int ()> f2(); int main() { std::cout << f1()() << " " << f2()() << "\n"; } 的不同定义正在破坏ODR。但本地课程不应该是明显的吗?有趣的是,如果我们用lambda函数替换F,就没有冲突。

这是编译器错误还是我误解了一个定义规则?

1 个答案:

答案 0 :(得分:1)

这显然是MSVC中的一个错误,因为所有类型都是唯一的。也许对于在某个函数内部定义的结构(在这种情况下为helper),MSVC在内部将它们视为定义为helper::F,而如果帮助程序是静态的,则应该执行类似此f1_cpp::helper::F的操作。 因此,链接时链接器会看到两个名称相同的内联函数,并将它们合并为一个。

最有可能通过重新排序输入文件,如果您对2 2不满意,可以获得1 1:)