Объявление частного использования базового конструктора не является частным - PullRequest
0 голосов
/ 04 мая 2018

Объявление using для базового конструктора является закрытым, но класс все еще может быть создан. Почему?

Специальные возможности работают по-разному для operator[] using декларации, которая должна быть публичной.

#include <vector>

template<typename T>
class Vec : std::vector<T>
{
private:
    using std::vector<T>::vector;       // Works, even if private. Why?
public:
    using std::vector<T>::operator[];   // must be public
};

int main(){
    Vec<int> vec = {2, 2};
    auto test = vec[1];
}

Что если бы я хотел, чтобы конструктор был приватным? Можно ли это сделать с помощью using декларации?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

using ссылка указывает, что унаследованный конструктор

имеет тот же доступ, что и соответствующий базовый конструктор.

Далее даются некоторые намеки на обоснование этого:

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

Очевидно, вы не можете явно constexpr или delete наследовать конструктор, поэтому эти характеристики просто наследуются. То же самое касается уровней доступа.

0 голосов
/ 04 мая 2018

Декларации использования для конструкторов базового класса сохраняют ту же доступность, что и базовый класс, независимо от доступности базового класса. От [namespace.udecl] :

Синоним, созданный объявлением об использовании, имеет обычную доступность для объявления члена. Использование-декларатор, который называет конструктор, не создает синоним; вместо этого дополнительные конструкторы доступны, если они будут доступны при использовании для создания объекта соответствующего базового класса , а доступность объявления использования игнорируется

выделение добавлено

На простом английском языке, из cppreference :

Он имеет тот же доступ, что и соответствующий базовый конструктор.

Если вы хотите, чтобы «унаследованные» конструкторы были приватными, вы должны вручную указать конструкторы. Вы не можете сделать это с помощью объявления об использовании.

...