gpt4 book ai didi

c++ - 在构造函数中将指针/引用传递给现有对象的首选方式是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:19:31 25 4
gpt4 key购买 nike

我将从示例开始。 boost中有一个很好的“标记器”类。它需要一个字符串被标记为构造函数中的参数:

std::string string_to_tokenize("a bb ccc ddd 0");
boost::tokenizer<boost::char_separator<char> > my_tok(string_to_tokenize);
/* do something with my_tok */

字符串在分词器中没有被修改,所以它是通过 const 对象引用传递的。因此我可以在那里传递一个临时对象:

boost::tokenizer<boost::char_separator<char> > my_tok(std::string("a bb ccc ddd 0"));
/* do something with my_tok */

一切看起来都很好,但是如果我尝试使用分词器,就会发生灾难。经过短暂的调查,我意识到,tokenizer 类存储了我给它的引用,并在进一步使用中使用。当然,它不能很好地用于引用临时对象。

文档没有明确说明构造函数中传递的对象将在以后使用,但是好的,也没有说明它不会:) 所以我不能假设这是我的错误。

然而,这有点令人困惑。在一般情况下,当一个对象通过 const 引用获取另一个对象时,表明可以在此处给出临时对象。你怎么看?这是一个糟糕的约定吗?也许在这种情况下应该使用指向对象(而不是引用)的指针?或者更进一步——给参数添加一些特殊关键字来允许/禁止将临时对象作为参数是不是很有用?

编辑:文档(1.49 版)相当简约,唯一可能暗示此类问题的部分是:

Note: No parsing is actually done upon construction. Parsing is done on demand as the tokens are accessed via the iterator provided by begin.

但它没有明确说明将使用给定的相同对象。

然而,这个问题的重点是在这种情况下讨论编码风格,这只是一个启发我的例子。

最佳答案

如果某个函数(例如构造函数)接受一个参数作为对常量的引用,那么它应该要么

  • 清楚地记录被引用对象的生命周期必须满足某些要求(如“在此之前未销毁”)

  • 如果稍后需要使用给定对象,请在内部创建拷贝。

在这种特殊情况下(boost::tokenizer 类),我假设后者不是出于性能原因和/或使该类可用于容器类型,而这些容器类型首先甚至不可复制。因此,我认为这是一个文档错误。

关于c++ - 在构造函数中将指针/引用传递给现有对象的首选方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9565375/

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