Может ли определение size_t в моем собственном пространстве имен создать двусмысленность или другие ошибки? - PullRequest
5 голосов
/ 11 апреля 2019

У меня есть следующий код, который определяет size_t, эквивалентный std::size_t и ::size_t, если я включил <cstddef>.

// h.hpp
namespace N {
  using size_t = decltype(sizeof(int));
}
// a.hpp
#include <h.hpp>
namespace N {
  class C {
    size_t size() const;
  };
  void f(size_t);
}
// ^^^ These use N::size_t!

Является ли это каким-либо образом нарушением стандарта C ++ и может ли это вызвать любые ошибки в любом коде, который использует как эти заголовки, так и любой другой стандартный заголовок, который определяет std::size_t и ::size_t? Я бы рассмотрел Это также ошибка, если кто-то не может использовать std::size_t и N::size_t взаимозаменяемо в любом контексте или если использовать просто size_t в любом контексте, это может привести к неопределенности.

// someOtherFile.cpp
#include <a.hpp>
#include <cstdint>
namespace N {
  // Can there be any problem here? (Inside N::)
}
// Or here? (Outside N::)

Я думаю, что нет, потому что и my, и стандартный size_t являются просто псевдонимами типа unsigned long (long) int

1 Ответ

6 голосов
/ 11 апреля 2019

Ваш псевдоним не вызовет никаких проблем.Он появляется в собственной области имен, поэтому объявление псевдонима ничего не объявляет повторно.И даже если клиентский код будет безответственным и сделает что-то непослушное, например:

using namespace std;
using namespace N;

size_t foo;

Это все еще хорошо, поскольку size_t относится к одному и тому же типу, независимо от того, из какого пространства имен получен псевдоним.Поиск имени завершается неудачно, только если одно и то же имя из разных пространств имен ссылается на разные сущности:

[namespace.udir]

6 Если поиск имени находит объявление для имени в двух разных пространствах имен, и объявления не объявляют одну и ту же сущность и не объявляют функции, использование имени некорректно.

«Сущность» в соответствии со стандартом C ++ охватывает широкий спектр вещей, включая типы.И это является камнем преткновения, потому что псевдоним типа не является типом, это только новое имя для уже существующего типа.Таким образом, два (неквалифицированных) псевдонима называют одно и то же.

...