Почему я могу получить доступ к структуре, определенной внутри функции, извне функции через вывод типа возврата?
Я смотрел один из видео Джейсона Тернера, и я увидел, что вы можете определить тип внутри области функций и получить его вне этого объем через функцию возврата типа типа.
auto f()
{
struct MyStruct
{
int n;
};
return MyStruct{};
}
int main()
{
auto a = f().n;
return a;
}
Почему это разрешено? Есть ли абзац в стандарте С++ 14, который позволяет это?
При попытке получить typeid
из MyStruct
с помощью clang в компилировать проводник я увидел на выходе сборки тип, отображаемый как f()::MyStruct
, поэтому существует область видимости, но каким-то образом я могу получить доступ к MyStruct
вне этой области. Это какая-то вещь ADL?
Ответы
Ответ 1
Нет, нет ADL. Поскольку ваша единица перевода содержит определение структуры, нет проблем с доступом к ее членам.
Важным моментом является то, что типы действительно не существуют в областях: имена. И обратите внимание, что вам не нужно использовать идентификатор MyStruct
вместо auto
при объявлении a
. Это имя недоступно, как должно быть. Однако, пока вы можете получить тип без использования недоступного имени, все в порядке.
В принципе, это вряд ли отличается от использования типа элемента private
:
class X
{
struct Hidden
{
int i;
};
public:
Hidden get() const { return {42}; }
};
int main()
{
X x;
auto h = x.get();
assert(h.i == 42);
}