给定代码:
template<typename T>
void foo(const T){}
当我执行以下操作时,幕后实际上发生了什么:
int main(){
string a;
string* pA = &a;
foo(string("test"));
foo(ref(A));
foo(pA);
return 0;
}
是否foo
获得这些对象的副本const
?还是foo
现在正在引用该对象但无法更改内容?
当您的函数按值获取参数时,它将获得一个副本。常数不起作用。
foo(string("test"))
在这种情况下,将创建一个临时对象。如果您的编译器应用Return Value Optimization,则将“就地”创建参数的值。换句话说,将只存在一个构造函数调用std::string("test")
,而不是复制函数构造函数调用,然后是临时构造函数的析构函数调用,而没有构造函数调用。
foo(rA);
在这种情况下,新std::string
会使用拷贝构造函数,复制的内容被创建a
到rA
是一个参考。
foo(ref(A));
在这种情况下,std::reference_wrapper<std::string>
将创建一个临时实例。再次,返回值优化将确保它是就地创建的,而不是被复制。
foo(pA);
在这种情况下,指针的复制方式与按值传递指针时复制指针的方式相同。指针的值不会改变(demo)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句