c++ visual-c++ one-definition-rule

c++ - ODR error en MSVC?



visual-c++ one-definition-rule (1)

Este programa imprime 1 1 lugar de 1 2 cuando se compila con MSVC (hasta 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"; }

Es como si las diferentes definiciones de F rompieran la ODR. ¿Pero no deberían ser distintas las clases locales? Curiosamente, si reemplazamos F con funciones lambda no hay conflicto.

Entonces, ¿esto es un error del compilador o estoy malinterpretando la regla de una definición?


Es claramente un error en MSVC, ya que todos los tipos son únicos. Quizás para las estructuras definidas dentro de alguna función (en este caso el helper ) MSVC las trata internamente como si estuvieran definidas como helper::F mientras que si el helper es estático, debería haber hecho algo como esto f1_cpp::helper::F Como resultado, en el momento del enlace, el enlazador ve dos funciones en línea con nombres idénticos y las combina en una.

Lo más probable es que al reordenar los archivos de entrada puede obtener 2 2 si no está satisfecho con 1 1 :)