【发布时间】:2013-03-13 13:36:24
【问题描述】:
我发现了一个在标准 C++11 中使用可选引用的技巧。 您认为这种技术是否可靠并且行为是否根据 C++ 标准定义良好?
// Optional reference using C++11
// V. Reverdy - 2013
#include <iostream>
#include <type_traits>
template <class T = int, class = typename std::enable_if<std::is_same<typename std::decay<T>::type, int>::value>::type>
void f(T&& n = T())
{
std::cout<<"--------"<<std::endl;
std::cout<<"is const = "<<std::is_const<T>::value<<std::endl;
std::cout<<"is reference = "<<std::is_reference<T>::value<<std::endl;
std::cout<<"is lvalue reference = "<<std::is_lvalue_reference<T>::value<<std::endl;
std::cout<<"is rvalue reference = "<<std::is_rvalue_reference<T>::value<<std::endl;
std::cout<<"--------"<<std::endl;
n *= 2;
}
int main(int argc, char* argv[])
{
int n = 42;
std::cout<<"n = "<<n<<std::endl;
f();
std::cout<<"n = "<<n<<std::endl;
f(n);
std::cout<<"n = "<<n<<std::endl;
return 0;
}
结果是:
n = 42
--------
is const = 0
is reference = 0
is lvalue reference = 0
is rvalue reference = 0
--------
n = 42
--------
is const = 0
is reference = 1
is lvalue reference = 1
is rvalue reference = 0
--------
n = 84
它似乎适用于 liveworkspace 上所有可用的编译器:LWS
【问题讨论】:
-
你有这方面的实际用例吗?
-
有趣的是类型类型
T在int、int&、int&&和int const&之间变化,如果您不传入,则会出现int选项任何事物。我们之所以得到不带参数的int,是因为使用了模板参数的默认值,这意味着不再推导T,并且不再在类型推导上下文中使用T&&...在该函数中尝试std::is_reference<decltype(n)>::value- 您的技术的缺点是T有时在演绎上下文中,有时不在。
标签: c++ templates c++11 pass-by-reference universal-reference