hgi*_*sel 0 c++ templates rvalue-reference move-semantics perfect-forwarding
我知道这可以用来执行完美的转发:
template <typename A>
void foo(A&&) { /* */ }
这可以用于在某种类型上执行完美转发:
template <typename A, std::enable_if_t<std::is_same<std::decay_t<A>, int>::value, int> = 0>
void foo(A&&) { /* */ }
但这些只是函数的模板,这意味着,这些函数会扩展为某些函数,然后将这些函数用于可能使用它的每个特殊情况.但是,这些扩展到:
void foo(A&) 和 void foo(A&&)
要么
void foo(A&) 和 void foo(A)
我一直认为,这将是第一个,但后来我注意到,在那种情况下,你将无法A const用作函数的参数,这当然有效.
然而,如果您使用正常的非常数左值,则第二个将是不明确的.它会打电话foo(A&)还是foo(A)?
这是第一个.第二个没有太大意义:没有A这样A&&的非引用类型.
如果参数是类型cv 的左值T,则A推导为cv T&.如果参数是类型cv 的右值T,则A推导为cv T并且A&&是cv T&&.因此,当您传入const左值时,生成的特化是可以接受const参数的特化.
| 归档时间: | 
 | 
| 查看次数: | 71 次 | 
| 最近记录: |