Почему sizeof и decltype не согласованы?
От: Tilir Россия http://tilir.livejournal.com
Дата: 26.06.17 10:39
Оценка:
Возьмём строковые литералы.

Сначала несколько простых вопросов и ответов.

Вопрос: какой тип у строкового литерала "Hello, world!"?
Ответ: его тип это const char[13]
Вопрос: что выведет decltype("Hello, world!")?
Ответ: поскольку массив это lvalue, будет выведено const char (&) [13]
Вопрос: что вернёт sizeof("Hello, world!")?
Ответ: sizeof("Hello, world!") == 14

А теперь философский вопрос: почему это так -- там 13 а там 14?

Нет, серьёзно. Дополнительный implicit нулевой завершающий символ влияет на sizeof, ок, так и сделали бы выведенный тип тоже шириной 14. Я погуглил ответ, но как-то никак. Я уверен, что это сделано for a reason, чтобы в языке что-нибудь такое важное срослось. Но что?

Спросил бы на stackoverflow, но вопрос получится "слишком общий" по тамошним правилам.
Re: Почему sizeof и decltype не согласованы?
От: uzhas Ниоткуда  
Дата: 26.06.17 10:54
Оценка: 8 (1)
Здравствуйте, Tilir, Вы писали:

T>Вопрос: что выведет decltype("Hello, world!")?

T>Ответ: поскольку массив это lvalue, будет выведено const char (&) [13]

как проверяли?
вот тут фигурирует число 14 в выхлопе
http://ideone.com/waRGdq

сделаем демангл: http://ideone.com/acHjP8
Отредактировано 26.06.2017 11:00 uzhas . Предыдущая версия .
Re: Почему sizeof и decltype не согласованы?
От: Conr Россия  
Дата: 26.06.17 10:57
Оценка:
Здравствуйте, Tilir, Вы писали:

T>А теперь философский вопрос: почему это так -- там 13 а там 14?

template<class T>
class view;

view<decltype("Hello, world!")> d;

Ошибки компиляции:

VC: error C2079: 'd' uses undefined class 'view<const char (&)[14]>'
GCC: error: aggregate ‘view<const char (&)[14]> d’ has incomplete type and cannot be defined
CLANG: error : implicit instantiation of undefined template 'view<char const (&)[14]>'


Откуда у вас 13 появилось?
Отредактировано 26.06.2017 11:04 Conr . Предыдущая версия .
Re[2]: Почему sizeof и decltype не согласованы?
От: Tilir Россия http://tilir.livejournal.com
Дата: 26.06.17 11:05
Оценка: :))) :)))
Здравствуйте, uzhas, Вы писали:

U>как проверяли?

U>вот тут фигурирует число 14 в выхлопе
U>http://ideone.com/waRGdq

U>сделаем демангл: http://ideone.com/acHjP8


Да, протупил. Там, где набирал первый пример забыл запятую. Действительно всё хорошо ))
Re[3]: Почему sizeof и decltype не согласованы?
От: Qbit86 Кипр
Дата: 26.06.17 12:12
Оценка:
Здравствуйте, Tilir, Вы писали:

T>Да, протупил. Там, где набирал первый пример забыл запятую. Действительно всё хорошо ))


Ложки нашлись, но осадок остался!
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Почему sizeof и decltype не согласованы?
От: uzhas Ниоткуда  
Дата: 26.06.17 12:12
Оценка: :))
Здравствуйте, Tilir, Вы писали:

T>Да, протупил. Там, где набирал первый пример забыл запятую. Действительно всё хорошо ))


надо на собеседках проверять скилл копи-пастить код
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.