Эта программа печатает 1 1
вместо 1 2
при компиляции с MSVC (до VS 2015).
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
на лямбда-функции, конфликт не будет.
Итак, это ошибка компилятора или я не понимаю одно правило определения?