'Использует пространство имен' в другом пространстве имен, эквивалентном псевдониму?

В C++ конструктора только с одним обязательным параметром считают неявной функцией преобразования. Это преобразовывает тип параметра в тип класса. Является ли это хорошей вещью или не зависит от семантики конструктора.

, Например, если у Вас есть строковый класс с конструктором String(const char* s), это, вероятно, точно, что Вы хотите. Можно передать const char* функции, ожидая String, и компилятор автоматически создаст временный файл String объект для Вас.

, С другой стороны, если у Вас есть буферный класс, конструктор которого Buffer(int size) берет размер буфера в байтах, Вы, вероятно, не хотите, чтобы компилятор бесшумно превратил int с в Buffer с. Для предотвращения этого Вы объявляете конструктора с explicit ключевое слово:

class Buffer { explicit Buffer(int size); ... }

Тот путь,

void useBuffer(Buffer& buf);
useBuffer(4);

становится ошибкой времени компиляции. Если Вы хотите передать временный файл Buffer объект, необходимо сделать так явно:

useBuffer(Buffer(4));

, Таким образом, если Ваш конструктор единственного параметра преобразовывает параметр в объект Вашего класса, Вы, вероятно, не хотите использовать explicit ключевое слово. Но если у Вас есть конструктор, который просто, оказывается, берет единственный параметр, необходимо объявить, что это как [1 113] препятствует тому, чтобы компилятор удивил Вас неожиданными преобразованиями.

10
задан pokita 13 August 2009 в 10:16
поделиться

2 ответа

namespace foo=bar;

Это не влияет ни на какие правила поиска имени. Единственный эффект - сделать foo псевдонимом bar. например:

namespace bar
{
  void b();
}

void f () {
  bar::b ();  // Call 'b' in bar
  foo::b ();  // 'foo' is an alias to 'bar' so calls same function
}

Следующее изменяет правила поиска

namespace NS
{
  namespace bar
  {
  }

  namespace foo {
    using namespace bar;

    void f () {
      ++i;
    }
  }
}

Когда выполняется поиск для «i», сначала будет выполняться поиск «foo», затем «NS», затем «bar».

16
ответ дан 3 December 2019 в 20:43
поделиться

Поскольку вы импортируете пространство имен в другое, то да, в этом отношении оно должно быть равным. Однако второй вариант также позволяет размещать в нем другой код, поэтому вы также можете помещать в него вещи, которые являются не частью пространства имен foo. Первый просто создает псевдоним.

2
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: