Спецификация std::decay
в N4296 оставляет следующее примечание:Каковы различия между std :: decay и pass-by-value?
[Примечание: Это поведение похож на Lvalue-к-Rvalue (4.1), массив к указателю (4.2), и функции к указателю (4.3) конвертация применяется, когда именующее выражение используется в качестве RValue, но и полоски CV-классификаторов из типов классов в порядке более близко моделировать по значению передачи аргумента. - конец примечание]
Мне кажется, что в идеале std::decay
бы модель по значению аргумента проходящее точно, но по какой-то причине она не определена таким образом.
Я думаю, что это можно определить в терминах вывода аргумента шаблона, и в этом случае реализация также может быть определена для вывода аргумента аргумента шаблона в точно прохождение аргумента модели по значению.
template <typename T>
struct decay {
private:
template <typename U>
static U impl(U);
public:
using type = decltype(impl(std::declval<T>()));
};
Вопросы:
- Каковы различия между
std::decay
и по значению аргумента мимоходом? - Действительно ли
std::decay
рассчитан на, чтобы не моделировать аргумент по значению, проходящий точно? - Будет ли реализация выше модели точно?
Одно из отличий заключается в том, что ваша реализация не будет работать, если 'T' не копируется, тогда как' decay' все равно сделает что-то разумное. Следовательно, * models *, но не * is *. – Barry