gpt4 book ai didi

c++ - 初始化引用时,何时以及为何获得拷贝?

转载 作者:IT老高 更新时间:2023-10-28 21:43:47 27 4
gpt4 key购买 nike

在某些情况下,我想要一个对象的引用,但我得到了一个拷贝。这是一个例子:

  std::pair<const std::string, int> foo("hello", 5);
const std::pair<std::string, int> & bar = foo;

std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
std::cout << "bar: " << bar.first << " " << bar.second << std::endl;
foo.second = 7;
std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
std::cout << "bar: " << bar.first << " " << bar.second << std::endl;

这会产生:

foo: hello 5
bar: hello 5
foo: hello 7
bar: hello 5

显然 foo 的拷贝已经创建,而语法表明(至少对我而言)程序员想要引用它。这违反了引用应该是某物的别名的原则。如果有人能解释发生了什么以及为什么会这样,那就太好了。

(注意:我遇到了这个here)

最佳答案

foobar 的底层类型不同,因此使用从 RHS 上的类型到 LHS 上的类型的隐式转换来创建临时的*。 C++ 标准允许 const 引用绑定(bind)到临时对象并延长其生命周期。

const 引用 bar 绑定(bind)到该临时对象,它是与 foo 不同的对象。

如果你使用相同的类型,你会得到你期望的结果:

std::pair<const std::string, int> foo("hello", 5);
const std::pair<const std::string, int> & bar = foo;

std::pair<std::string, int> foo("hello", 5);
const std::pair<std::string, int> & bar = foo;

会产生

foo: hello 5
bar: hello 5
foo: hello 7
bar: hello 7

*std::pairtemplate constructor允许从一种类型对到另一种类型的隐式转换。

关于c++ - 初始化引用时,何时以及为何获得拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28150846/

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