c++ - MSVC 中的 ODR 错误?

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

当使用 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/

相关文章:

visual-studio-2008 - 在构建期间复制文件

c++ - 了解导致此多重定义错误的原因

c++ - 在多个类中实现堆栈时的单一定义规则 (ODR)

c++ - QT 是否使用托管代码?

c++ - 使用 C++ 的 Tesseract API 的包装器类

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

visual-c++ - 不同的值取决于浮点异常标志设置

c++ - 如何在 C++ 中使用指针从数组中删除最后一个元素?

c++ - std::piecewise_construct 不会导致 ODR 违规吗?

c++ - 如何配置VC++ devenv.com命令行的Include/Lib目录?