Компилятор дивергенции, как получить доступ к частному конструктору вложенного класса?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Компилятор дивергенции, как получить доступ к частному конструктору вложенного класса?

Сообщение Anonymous »

Это так смешно < /p>
// Case 0: all pass
class enclosing
{
class nested {
nested() = default;
};
public:
enclosing() : member{} {};
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 1: all pass
class enclosing
{
class nested {
friend class enclosing;
nested() = default;
};
public:
enclosing() {};
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 2: All fail
class enclosing
{
class nested {
// friend class enclosing;
nested() = default;
};
public:
enclosing(){};
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 3: C++17 all pass, C++20 All fail
class enclosing
{
class nested {
// friend class enclosing;
nested() = default;
};
public:
enclosing() : member{} {};
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 4: C++17 all pass except
// clang warning but clang returned 0, C++20 All fail
class enclosing
{
class nested {
// friend class enclosing;
nested() = default;
};
public:
enclosing() = default;
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 5: C++17 all pass, C++20 all fail
class enclosing
{
class nested {
// friend class enclosing;
nested() = default;
};
public:
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 6: C++17 all pass, C++20 MSVC pass, clang gcc fail
class enclosing
{
class nested {
friend class enclosing;
nested() = default;
};
public:
nested member;
};
int main()
{
enclosing e{};
}
< /code>
// Case 7: All pass
class enclosing
{
class nested {
friend class enclosing;
nested() = default;
};
public:
static nested member;
};
enclosing::nested enclosing::member{};
int main()
{

}
< /code>
Вопросы: < /p>
, как упомянуто в CppReference#nest_types: < /p>

Вложенные классные объявления подчиняются спецификаторам доступа членов, частный класс не может быть назван вне сферы действия класса прилагающего /> < /blockquote>
  • Дело 7 должно быть незаконным? < /li>
    < /ol>
    , как описано в N4713 и позже. Участники класса в приложении не имеют особого доступа к членам вложенного класса; Обычные правила доступа (пункт 14) подчиняются. И все случаи с этим должны быть лигал (случай 6)?


Подробнее здесь: https://stackoverflow.com/questions/797 ... onstructor
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»