使用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
,就没有冲突。
这是编译器错误还是我误解了一个定义规则?
答案 0 :(得分:1)
这显然是MSVC中的一个错误,因为所有类型都是唯一的。也许对于在某个函数内部定义的结构(在这种情况下为helper
),MSVC在内部将它们视为定义为helper::F
,而如果帮助程序是静态的,则应该执行类似此f1_cpp::helper::F
的操作。
因此,链接时链接器会看到两个名称相同的内联函数,并将它们合并为一个。
最有可能通过重新排序输入文件,如果您对2 2
不满意,可以获得1 1
:)