正如@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
从create_A()
. 但是,它会在编译期间检查A
的复制/移动构造函数(它不会使用)是否可用/可访问。从 C++17 开始,复制/移动省略是“正确”完成的,此类代码不需要复制/移动构造函数。(另外,我可能记错了,它可能正在检查复制/移动分配。)