2015-10-28 7 views
5

VS2015 скомпилирует и выполняет следующий фрагмент без проблем. g ++ и clang не связывают код, и я думаю, что они верны.Является ли мое понимание о [basic.link]/7 в N4140 правильным?

#include <iostream> 

namespace X { 
    void p() { 
     void q(); // This is a block scope declaration of the function q() with external 
        // linkage (by §3.5/6), which then must be defined in namespace X, 
        // according to §3.5/7, and not in the global namespace. 
     q(); 
    } 
} 

void q() { std::cout << "q()" << '\n'; } 

int main() 
{ 
    X::p(); 
} 

ответ

4

Ваш пример почти идентичен вашему примеру в [basic.link]/7 - Да, ваша интерпретация верна.
Использование неопределенной функции q делает вашу программу плохо сформированной NDR. Следовательно, VC++ технически соответствует. Однако вы определенно хотите сообщить об этом.

Обратите внимание, как VC++ produces the same output ("д()"), даже если мы добавим внутреннее определение из q:

namespace X { 
    void p() { 
     void q();      
     q(); 
    } 

    void q() { std::cout << "This would be right"; } 
} 

void q() { std::cout << "q()" << '\n'; } 

... но есть разумное поведение when extern is used.

+0

Почему NDR? Должен ли компоновщик сообщить об ошибке в этом случае? – Belloc

+0

@Belloc Реализация должна, но не требуется. – Columbo

+0

Откуда у вас этот номер? – Belloc