Почему std :: function_ref разрешает проходить в истекающем функционе, а не запрещает его?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему std :: function_ref разрешает проходить в истекающем функционе, а не запрещает его?

Сообщение Anonymous »

на https://en.cppreference.com/w/cpp/utili ... n_ref.html существует перегруженный CTOR следующим образом:

Код: Выделить всё

template
function_ref(F&& f) noexcept;
< /code>

[list]
[*] Инициализирует границу с помощью std :: addressof (f) < /code> и thunk-ptr с
адрес функции Thunk. Эта перегрузка участвует в разрешении перегрузки только если:

std::remove_cvref_t
не тот же тип, что и function_ref ,
[*]

Код: Выделить всё

std::is_member_pointer_v
IS false и
[*]

Код: Выделить всё

/\*is-invocable-using\*/
is true.
[/list]





It seems that the ctor allows the caller to pass in an expiring functor and uses the dangling reference to invoke the Dead Functor. Приведенный ниже код может продемонстрировать проблему. < /P>

Код: Выделить всё

#include 

std::function_ref f() {
auto       n  = 1;
auto const fn = [n](int m) { return n + m; };
return std::function_ref(std::move(fn)); // eligible for ctor 2.
}

int main() {
auto fn_ref = f();
// fn_ref is now referencing to a dead functor!
return fn_ref(2); // BANG!
}
Сравните его с std :: ref , который хорошо разработан для той же проблемы:

Код: Выделить всё

template
void ref(const T&&) = delete;

template
void cref(const T&&) = delete;
Мне просто интересно:
Почему стандарт не просто отклоняет аргумент функционирования, если это Rvalue-reference (включая && и const && )?

Подробнее здесь: https://stackoverflow.com/questions/796 ... r-than-dis
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»