当使用 MSVC(VS 2015)编译时,此程序打印 1 1
而不是 1 2
。
f1.cpp:
#include <functional>
static std::function<int ()> helper() {
struct F { int operator()() { return 1; } };
return F();
}
std::function<int ()> f1() { return helper(); }
f2.cpp:
#include <functional>
static std::function<int ()> helper() {
struct F { int operator()() { return 2; } };
return F();
}
std::function<int ()> f2() { return helper(); }
main.cpp:
#include <functional>
#include <iostream>
std::function<int ()> f1();
std::function<int ()> f2();
int main() {
std::cout << f1()() << " " << f2()() << "\n";
}
好像 F
的不同定义正在破坏 ODR。但是本地类不应该是不同的吗?有趣的是,如果我们将 F
替换为 lambda 函数,则不会发生冲突。
那么这是编译器错误还是我误解了单一定义规则?
最佳答案
这显然是 MSVC 中的一个错误,因为所有类型都是唯一的。也许对于在某些函数中定义的结构(在本例中为 helper
),MSVC 在内部将它们视为定义为 helper::F
而如果 helper 是静态的,它应该已经完成像这样的 f1_cpp::helper::F
代替。
结果,在链接时,链接器会看到两个同名的内联函数并将它们合并为一个。
如果您对 1 1
不满意,很可能通过重新排序输入文件可以获得 2 2
:)
关于c++ - MSVC 中的 ODR 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33545027/