gpt4 book ai didi

c++ - 是否重新创建对象/引用/指针以添加常量

转载 作者:行者123 更新时间:2023-11-30 04:00:03 25 4
gpt4 key购买 nike

给定代码:

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 现在正在引用此对象但无法更改内容?

最佳答案

当您的函数按值获取参数时,它会获得一个拷贝。 Const-ness 没有发挥作用。

foo(string("test"))

在这种情况下,会创建一个临时对象。如果您的编译器适用 Return Value Optimization ,参数的值将“就地”创建。换句话说,只有一个构造函数调用 std::string("test") ,而不是构造函数调用后跟复制构造函数调用后跟临时对象的析构函数调用。

foo(rA);

在这种情况下,一个新的 std::string将使用复制构造函数创建,复制 a 的内容rA是一个引用。

foo(ref(A));

在本例中是 std::reference_wrapper<std::string> 的临时实例被 build 。同样,返回值优化将确保它是就地创建的,而不是被复制的。

foo(pA);

在这种情况下,指针的复制方式与指针按值传递时的复制方式相同。指针的值不会改变 ( demo )。

关于c++ - 是否重新创建对象/引用/指针以添加常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26529480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com