Що таке const void?


89

В описі std::is_voidзазначено, що:

Забезпечує значення константи члена, яке дорівнює істині, якщо T - тип void, const void, volatile void або const volatile void.

Тоді що може бути const void, або a volatile void?

У цій відповіді зазначено, що const voidтип повернення буде недійсним (однак компілюється у VC ++ 2015)

const void foo() { }

Якщо за стандартом const voidнедійсний (VC помиляється) - то що const void?


15
Відповідь, на яку ви посилаєтесь, не говорить про те, що вона була б недійсною, а про те, що вона була б "безглуздою", що, як я вважаю, означає "не пропонує ніяких переваг над voidбез const".

@hvd, у відповіді зазначено, що компілятор повинен попередити / помилку про таку кваліфікацію. Тим самим я припускаю, що стандарт C ++ не допускає кваліфікації зvoid
Ajay

2
У відповіді зазначено, що компілятор повинен попередити про таку кваліфікацію, він не згадує про помилку, і помилка буде неправильною. Це зауваження стосується лише якості впровадження, а не відповідності, але я можу зрозуміти, що це зовсім не зрозуміло з самого зауваження.

@Ajay стандарт не вказує, що має бути попередження, коли ви використовуєте безглуздий код. Gcc вирішив дати вам додатковий натяк про те, що цей код нічого не робить. Але ВК нічим не помиляється.
user1942027

3
@Ajay У відповіді зазначено, що clang дає попередження, і що, на думку автора, повинні робити інші компілятори. Якби стандарт цього не дозволяв, це була б помилка, а не попередження.
молбдніло

Відповіді:


94

const voidце тип, на який ви можете сформувати вказівник. Це схоже на звичайний покажчик порожнечі, але перетворення працюють інакше. Наприклад, a const int*не можна неявно перетворити в a void*, але його можна неявно перетворити в a const void*. Так само, якщо у вас є a, const void*ви не можете static_castйого до a int*, але можете static_castдо a const int*.

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
Незважаючи на те, що ваша відповідь хороша, в ній не вказана причина const void, а її навколо порожніх та непустотних покажчиків [з (не) константою].
Аджай

26
@Ajay: Я не згоден. A const void*- це єдина причина, яку ти коли-небудь побачиш const void. Він може бути переданий як аргумент шаблону, але цей тип аргументу буде коли-небудь інстанційований лише *з кінцем в кінці.
Бенджамін Ліндлі,

@BenjaminLindley Ви також можете побачити питання, яке задав юристconst void з питань мови
cpplearner

3
@Ajay: У якийсь момент це питання стає питанням філософії. "Причиною" const voidє те, що всі типи в C ++ можуть бути створені const. Він "існує" так само, як і voidіснує. Відповідь Бенджаміна Ліндлі пояснює, що це таке, коли ви його бачите і як ним користуєтесь.
Кріс Бек,

23

Як void, const voidє порожнім типом. Однак, якщо const voidце тип повернення , то constце безглуздо (хоч і законно!), Оскільки [expr] / 6 :

Якщо перше значення первісно має тип “ cv T ”, де Tє некваліфікованим некласовим типом , що не є масивом, тип виразу коригується Tдо будь-якого подальшого аналізу.

Однак сам він є допустимим типом і зустрічається, наприклад, у бібліотечних функціях стандарту C , де він використовується для забезпечення правильності const аргументів покажчиків аргументів: int const*неможливо перетворити в void*, але void const*.


const voidоскільки тип повернення впливає на тип функції, тому це не зовсім безглуздо.
cpplearner

1
@cpplearner Окрім цього, це є у будь-якому практичному сенсі, оскільки це не впливає ні на підпис функції, ні на тип виклику до неї.
Коламбо,

Ну, це може змінити підпис шаблону функції. +1 тим не менше
cpplearner

@cpplearner Досить справедливо - це все одно марно натискання клавіш.
Коламбо,

Зазвичай ми бачимо: const int * не може перейти у void *, але const void *.
mgouin

18

Типи можуть бути результатом шаблонів; шаблон може const Tвказувати і створювати екземпляр Tяк void.

Відповідна відповідь вводиться в оману, або, вірніше, обмежена з огляду на те, що вона стосується особливого випадку нешаблонного типу, і навіть тоді const voidможе бути безглуздою , але це дійсний код .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.