2016-09-01 2 views
1

Можно предположить в неоценимом контексте, что (::new (std::declval< void * >()) T())->~T() семантически (в смысле noexcept, но не в смысле типа выражения), эквивалентного простому T()? Предположим, что ни глобальная, ни классовая область operator new не перегружены, если они много борются.Размещение нового плюс деструктор и простая инициализация значения noexcept semantic

Часто используемые типы T() используются внутри оператора noexcept(), чтобы определить, является ли только отдельный конструктор noexcept или нет. Конечно, это неправильно.

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

ответ

0

Можно предположить в невычисленном контексте, что (::new (std::declval< void * >()) T())->~T() семантический полный эквивалент простого T()?

Нет, последнее выражение есть функция деструктора, которая неявно возвращает тип возврата void.

#include <new> 
#include <type_traits> 

struct T{int x; double y; }; 
int main(){ 
    constexpr int size = sizeof((::new (std::declval< void * >()) T())->~T()); 
} 

Компилятор должен жаловаться пытается получить ЯРМАРКА sizeofvoid

+0

. Виноват. Я хочу рассматривать только «бессмысленный» смысл. Пожалуйста, позвольте мне изменить вопрос. – Orient

Смежные вопросы