#include <vector>
using namespace std;
void f(const vector<int>&) {}
void f(vector<int>&&) {}
int main()
{
{
vector<int> coll;
//
// coll is dying, so,
// "f(coll)" will call "f(const vector<int>&)" or
// "f(vector<int>&&)" as per C++11?
//
f(coll);
}
}
在上面的代码中,coll
即将死亡;那么,f(coll)
会根据C ++ 11调用f(const vector<int>&)
或f(vector<int>&&)
吗?
答案 0 :(得分:5)
如果f(coll)
调用f(vector<int>&&)
而不是f(const vector<int>&)
,那将违反标准,因为它会选择错误的函数重载。
如果呼叫的解决方案根据呼叫的位置以及使用coll
呼叫后是否有任何后续语句而有所不同,那么这也会相当混乱。
特殊待遇仅限于return values:
如果
expression
是左值表达式并且满足 copy elision 的条件,或者满足条件,除了表达式命名函数参数,然后重载决策以选择构造函数用于初始化返回值的用法执行两次:首先好像表达式是一个右值表达式(因此它可以选择移动构造函数或引用const的复制构造函数),如果没有合适的转换可用,则执行重载决策第二次,使用左值表达式(因此它可以选择复制构造函数来引用非const)。