Ten program wyświetla 1 1
zamiast 1 2
po kompilacji z MSVC (do VS 2015).Błąd ODR w MSVC?
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";
}
To jakby inna Definicje F
powodują zerwanie ODR. Ale czy lokalne klasy nie powinny być odrębne? Co ciekawe, jeśli zastąpimy F
z funkcjami lambda, nie ma konfliktu.
Czy jest to błąd kompilatora, czy też nie rozumiem zasady jednej definicji?
Bit szalony, że MSVC dostaje coś takiego złego. Nawet się pomyli, jeśli usuniesz 'static' i użyje nienazwanego obszaru nazw. – Simple
Co stanie się, gdy użyjesz dwóch oddzielnych couts zamiast jednego? – cup
Jesteś pewien? W przypadku MSVC 14.0, jeśli 'helper()' zostanie umieszczony w anonimowym obszarze nazw, konflikt zniknie. –