Хоча я не можу знайти чітких згадок у цьому робочому проекті стандарту C ++ (з 2014 року), що перетворення з std::nullptr_t
на цілісний тип заборонено, також не згадується, що таке перетворення дозволено!
Однак, в разі переходу від std::nullptr_t
To bool
буде явно згадано:
4.12 Булеві перетворення
Перше значення арифметичного, нескореного перерахування, вказівника або вказівника на тип члена може бути перетворене в перше значення типу bool. Нульове значення, нульове значення вказівника або значення вказівника нульового члена перетворюється на помилкове; будь-яке інше значення перетворюється на істинне. Для прямої ініціалізації (8.5), первісне значення типу std :: nullptr_t може бути перетворене в первісне значення bool типу; отримане значення хибне.
Крім того, єдине місце в цьому проекті документа, де std::nullptr_t
згадується перетворення на інтегральний тип, - у розділі "Повторний_випуск":
5.2.10 Повторна інтерпретація виклику
...
(4) Вказівник може бути явно перетворений у будь-який інтегральний тип, достатньо великий для його утримання. Функція відображення визначена реалізацією. [Примітка. Він призначений не дивувати тих, хто знає структуру адреси базової машини. - кінцева примітка] Значення типу std :: nullptr_t можна перетворити на інтегральний тип; перетворення має те саме значення та обґрунтованість, що й перетворення (void *) 0 на інтегральний тип. [Примітка: Повторний_каст не можна використовувати для перетворення значення будь-якого типу у тип std :: nullptr_t. - кінцева примітка]
Отже, з цих двох спостережень можна (ІМХО) обгрунтовано припустити, що MSVC
компілятор правильний.
РЕДАКТУВАННЯ : Однак ваше використання "функціональної нотації" може насправді говорити про зворотне! У MSVC
компілятора немає жодних проблем із використанням перекладеного в C-стилі, наприклад:
uintptr_t answer = (uintptr_t)(nullptr);
але (як у вашому коді), він скаржиться на це:
uintptr_t answer = uintptr_t(nullptr); // error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'uintptr_t'
І все-таки з того самого проекту стандарту:
5.2.3 Явне перетворення типів (функціональне позначення)
(1) Специфікатор простого типу (7.1.6.2) або специфікатор імені типу (14.6) з подальшим укрупненим списком виразів будує значення вказаного типу, заданого списком виразів. Якщо список виразів є одиничним виразом, вираз перетворення типу еквівалентний (у визначеності та якщо визначений у значенні) відповідному виразному формулюванню (5.4). ...
"Відповідний вираз амплуа (5.4)" може стосуватися амплуа в стилі С.