2015-07-04 4 views
18

В [namespace.udecl]/10 у вас есть следующий пример:Использование декларации не может быть повторено в области функций. Почему это?

namespace A { 
    int i; 
} 
namespace A1 { 
    using A::i; 
    using A::i; // OK: double declaration 
} 
void f() { 
    using A::i; 
    using A::i; // error: double declaration 
} 

Этот фрагмент кода компилирует в звоне.

+1

Какая практическая проблема может быть причиной этого? –

+0

@LightnessRacesinOrbit: Этот вопрос является вопросом языка. Для таких вопросов не должно быть никаких практических проблем, чтобы они были интересными. Об определении языка программирования. – Supremum

+0

@ Супремум: [_ "если ваш вопрос обычно охватывает ... практическую, ответственную проблему ... тогда вы в правильном месте, чтобы задать свой вопрос!" _] (Http://stackoverflow.com/help/on-topic) Это может быть интересно, но это не по теме. –

ответ

7

Первый - это объявление внутри пространства имен, а краткие операторы использования могут часто встречаться с использованием #includes. Второй - внутри определения функции, и вы никогда не сделаете этого, если не допустили ошибку. Вы не можете определить один и тот же символ дважды, например, но вы можете объявить несколько раз.

Оператор using также является не просто декларацией. Он немного сильнее, поскольку он импортирует функцию из одного пространства имен в другое. Например, он может вытащить функцию защищенного базового класса в производный класс, делая его общедоступным. Это почти определение связью.

+0

Не могли бы вы предоставить цитату из стандарта? – Belloc

+0

Ответ на этот связанный вопрос решает этот вопрос: http://stackoverflow.com/questions/31224886/program-with-chaining-of-using-declarations-compiles-on-msvs-and-clang-but-not-o Обратите внимание, что пример [namespace.udecl]/10 неверен и только что был изменен в ответ на мой связанный вопрос. – Supremum

 Смежные вопросы

  • Нет связанных вопросов^_^