CPP_LECTS_RUS Telegram 241
И снова время пятничного зачила. Наливайте пивка, открывайте последний драфт стандарта C++23 (N4950) и поехали.

Рассмотрим вот такой пример, обозначим его [1].

class X {
template <typename U> struct Hidden {};
};

template <typename T>
using Wrapper = typename X::template Hidden<T>;

int main() {
Wrapper<float> w;
}


https://godbolt.org/z/sMnec5nx4

В нём clang и gcc почему-то не выдают ошибок, хотя имя является скрытым. Тут хочется воскликнуть — ну наверное по стандарту открытость using зависит от него а не от того что он алиасит. Не торопитесь, читайте дальше.

Уберём шаблоны и получим пример [2].

class X {
struct Hidden {};
};

using Wrapper = typename X::Hidden;

int main() {
Wrapper w;
}


https://godbolt.org/z/q9TYMeaYo

Вроде он мало чем отличается, тоже using, но тут оба компилятора отказываются компилировать.

Теперь пойдём от [1] в другом направлении: заменим using на struct и получим пример [3].

class X {
template <typename U> struct Hidden {};
};

template <typename T>
struct Wrapper : X::template Hidden<T> {};

int main() {
Wrapper<int> w;
}


https://godbolt.org/z/Gs1s3z8qn

Оба компилятора отказываются компилировать. То есть using всё-таки важен? Ситуация становится интересней.

И теперь сделаем последний шаг: запишем пример [3], но не будем инстанцировать шаблон (т.е. уберём функцию main) и получим пример [4].

https://godbolt.org/z/9EM1avbxe

И внезапно тут мнения компиляторов расходятся. Clang выдаёт ошибку, тогда как gcc отлично компилирует.

Вопросы:
1. Обоснуйте с точки зрения стандарта чем отличается [1] от [2]
2. Обоснуйте с точки зрения стандарта чем отличается [1] от [3]
3. Обоснуйте с точки зрения стандарта какой из компиляторов прав в [4]?

Ответы кидайте в комментарии к посту. Ссылки на нормативные документы обязательны.

Призов не обещаю (кроме зрительских симпатий). Рекомендуется сначала подумать самостоятельно, потом заезжать в комментарии.

#questions



tgoop.com/cpp_lects_rus/241
Create:
Last Update:

И снова время пятничного зачила. Наливайте пивка, открывайте последний драфт стандарта C++23 (N4950) и поехали.

Рассмотрим вот такой пример, обозначим его [1].

class X {
template <typename U> struct Hidden {};
};

template <typename T>
using Wrapper = typename X::template Hidden<T>;

int main() {
Wrapper<float> w;
}


https://godbolt.org/z/sMnec5nx4

В нём clang и gcc почему-то не выдают ошибок, хотя имя является скрытым. Тут хочется воскликнуть — ну наверное по стандарту открытость using зависит от него а не от того что он алиасит. Не торопитесь, читайте дальше.

Уберём шаблоны и получим пример [2].

class X {
struct Hidden {};
};

using Wrapper = typename X::Hidden;

int main() {
Wrapper w;
}


https://godbolt.org/z/q9TYMeaYo

Вроде он мало чем отличается, тоже using, но тут оба компилятора отказываются компилировать.

Теперь пойдём от [1] в другом направлении: заменим using на struct и получим пример [3].

class X {
template <typename U> struct Hidden {};
};

template <typename T>
struct Wrapper : X::template Hidden<T> {};

int main() {
Wrapper<int> w;
}


https://godbolt.org/z/Gs1s3z8qn

Оба компилятора отказываются компилировать. То есть using всё-таки важен? Ситуация становится интересней.

И теперь сделаем последний шаг: запишем пример [3], но не будем инстанцировать шаблон (т.е. уберём функцию main) и получим пример [4].

https://godbolt.org/z/9EM1avbxe

И внезапно тут мнения компиляторов расходятся. Clang выдаёт ошибку, тогда как gcc отлично компилирует.

Вопросы:
1. Обоснуйте с точки зрения стандарта чем отличается [1] от [2]
2. Обоснуйте с точки зрения стандарта чем отличается [1] от [3]
3. Обоснуйте с точки зрения стандарта какой из компиляторов прав в [4]?

Ответы кидайте в комментарии к посту. Ссылки на нормативные документы обязательны.

Призов не обещаю (кроме зрительских симпатий). Рекомендуется сначала подумать самостоятельно, потом заезжать в комментарии.

#questions

BY C++ and other lectures


Share with your friend now:
tgoop.com/cpp_lects_rus/241

View MORE
Open in Telegram


Telegram News

Date: |

But a Telegram statement also said: "Any requests related to political censorship or limiting human rights such as the rights to free speech or assembly are not and will not be considered." fire bomb molotov November 18 Dylan Hollingsworth yau ma tei Your posting frequency depends on the topic of your channel. If you have a news channel, it’s OK to publish new content every day (or even every hour). For other industries, stick with 2-3 large posts a week. SUCK Channel Telegram Add up to 50 administrators
from us


Telegram C++ and other lectures
FROM American