以下代码无法编译。Clang 显示以下错误信息:
这是合理的,因为防止
以下方案可以修复我的代码:
candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
这似乎是因为f()内的a被视为左值。struct A{};
void g(A&& a){
return;
}
void f(A&& a){
g(a);
}
int main(){
return 0;
}
这是合理的,因为防止
f()
调用g()
多次。以下方案可以修复我的代码:
g(std::move(a));
但在我看来似乎有问题:如果有人修改f()
的签名为void f(A& a)
会发生什么。
是否有更好的惯用语?
template<typename T> void f(T&& a) { g(std::forward<T>(a));
,再加上某种 SFINEA 以阻止除 A 类型之外的类型。... 不过我觉得原始代码没有任何问题。 - M.M