Как ответил @Quentin, это возможно только начиная с C ++ 17. Однако, если вы в порядке с вызовом функции для создания ваших A
объектов, следующее должно делать то, что вы хотите в C ++ 11:
template <class T, class NonRefT = typename std::remove_reference<T>::type>
A<NonRefT> create_A (T && t) {
return A<NonRefT>(std::forward<T>(t));
}
// Or even closer to your original code:
template <class T>
auto create_A (T && t) -> A<decltype(t)> {
return A<decltype(t)>(std::forward<T>(t));
}
Я использовал std::remove_reference
на основе вашего использования decltype
, хотя вы можете вместо этого использовать std::decay
.
int main () {
int value = 5;
auto a = create_A(value);
}
Если я правильно помню, пример кода имеет крайний случай, где он не работает как ожидалось до C ++ 17. Компилятор исключит конструктор копирования / перемещения для создания a
из значения r, возвращаемого create_A()
. Однако во время компиляции он будет проверять, доступен ли / 101 * конструктор копирования / перемещения (который он не будет использовать). Начиная с C ++ 17, удаление / перемещение выполняется «правильно», и для такого кода не требуется конструктор копирования / перемещения. (Кроме того, я могу ошибаться, и вместо этого он может проверять назначение копирования / перемещения.)