Эта программа печатает 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
лямбда-функциями, конфликта не будет.
Так это ошибка компилятора или я неправильно понимаю одно правило определения?
static
и используете безымянное пространство имен. - person Simple   schedule 05.11.2015helper()
помещается в анонимное пространство имен, конфликт исчезает. - person Valentin Milea   schedule 05.11.20151 2
сейчас. Клянусь, я получал1 1
, когда писал этот комментарий. :П - person Simple   schedule 05.11.2015f1.cpp
иf2.cpp
изменились. - person Simple   schedule 05.11.2015/opt:noicf
, это кажется натяжкой, но я видел некоторые интересные перерывы из-за этого, поэтому стоит попробовать. - person Shafik Yaghmour   schedule 06.11.2015/link /opt:noicf
. Я предполагаю, что свертывание применимо только к функциям с идентичными определениями, что здесь не так. - person Valentin Milea   schedule 06.11.2015F
из функции в анонимное пространство имен в ваших исходных файлах. - person Gambit   schedule 11.02.2017