问题标签 [const-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
280 浏览

c++ - Visual C++ 2013 中 const 引用的赋值

在 Visual C++ 2013 中,将临时值分配给 const 引用是合法的,例如

在一个大型软件项目中,我偶然发现了一行代码,执行时间大约为 10 毫秒:

Item是一个大约 20 字节的结构,instance->getItems()返回一个 const std::vector< Item>&。我没有看到为什么这条线的执行时间应该超过一瞬间,所以我玩了一下,发现

也需要 10 毫秒,而

如您所料,几乎是即时的,即 0.00.. ms。

问题是,我可以在现有的复杂软件项目中可靠地重现此问题,但在任何精简的最小示例中,两个版本的运行速度都一样快。我已经在启用了优化的发布版本中测试了所有这些。这些优化之一是否有可能使此异常为 const 引用赋值真的很慢?我真的很想知道是什么导致了这种行为。有谁知道是什么原因造成的?

跟进,是否有为我意外禁用的 const 引用分配值的警告?如果是,它的 id 是什么?如果编译器可以指出代码中发生这种情况的其他地方,那将会很方便。

编辑:计时是在感兴趣的代码之前和之后用一个简单的 CPU 时钟完成的,除以每秒的时钟周期。它不太准确,但可以让您大致了解 10.something 和 0.something 之间的区别。而且它不会以任何方式波动,在这个特定的例子中它是完全可重现的。执行时间存在显着差异。

0 投票
1 回答
1147 浏览

c++ - const auto& 用于存储函数结果,值得吗?

假设我们有一个返回复杂对象的函数,例如std::string

将调用该方法的结果存储在 中是否值得const auto&

这种方法可以防止复制/移动对象。所以很好。但另一方面,auto又引入了统一的左边赋值。Herb Sutter 在 CppCon2014 的演讲中提到了 C++ 从左到右的现代风格https://www.youtube.com/watch?v=xnqTKD8uD64 (39:00-45:00)。

在 C++98 中存储std::stringat const ref 很好。它在 C++11 中如何?

更新(2016-07-27 2:10 GMT+0):

抱歉,我的问题不准确。我的意思是编码风格 - 是添加更好const &还是只留下来auto让编译器做它想做的任何事情。

更新示例:

两种方法:

对比

问题:我们应该

  • 用于const auto&存储复杂的返回对象和auto原语,或
  • 使用auto一切来保持 Herb 在他的演示文稿中提到的从左到右的现代 C++ 风格(上面的链接)。
0 投票
2 回答
973 浏览

c++ - 对 unsigned int 中转换的 int 的 const 引用

我在理解此代码段中的行为时遇到了一些麻烦:

第一个打印语句按我的预期给出了 2,但是当我更改引用变量的值时,它不会反映在引用中。第二个打印语句也给出 2,但我认为它应该给出 100?

如果我将变量i转换为 typeint而不是unsigned int,它会按我的预期工作。这里发生了什么?

活生生的例子

0 投票
1 回答
64 浏览

c++11 - 定义的函数返回对类成员的 const 引用和变量的副本

返回一个 const 引用,我仍然有点困惑。可能,这已经讨论过了,但是让我们有以下代码,因为我没有找到相同的代码:

究竟会发生什么,当我打电话

这个对吗?从我的角度来看,它是并且制作了所请求结构的副本,对吗?

另一方面,

返回对对象成员的引用,这是正确的,除非 T 对象没有被破坏。我对吗?

0 投票
2 回答
64 浏览

c++ - 模板化的数学函数应该采用值还是 const 引用?

假设我想实现一些简单的数学函数;例如,假设它是 (C++17's) 的重新实现std::clamp:此函数接受一个数字、一个下限和一个上限,如果它超出了它们定义的范围,则将该数字设置为这些边界之一。如果它是一个具体的数字类型,比如说int,我会写:

但如果它是一个模板,我看到可能是标准将使用的示例实现const&使用's 而不是值。因此,使引用变得更简单,例如:

我的问题是:

  • 使用 const 引用有什么好处,因为T's 是简单的数字类型?
  • 同上,对于将单个数字包装为数据成员(例如std::chrono持续时间)的一些抽象事物的类型?
  • 为什么在const&任何相对简单的(constexpr?)无副作用的数学函数的一般情况下取一个值是一个更好的主意?

笔记:

  • 我意识到,const&当您拥有某种 k 维向量类型或boost::rationals 和其他类似数字的类型时,可能会开始有意义;但即便如此,编译器不会优化复制吗?
  • 不是在问任何任意的 C++ 函数,以及它是否应该只按值获取参数,这显然是个坏主意。
0 投票
1 回答
190 浏览

c++ - 从 lambda 返回局部变量到 const ref

可以像这样在 const ref 中捕获结果吗?

0 投票
1 回答
256 浏览

c++ - 为什么调用pop()后top()的返回值会发生变化?

priority_queue调用后的top()更改返回的 const 引用pop()(visual studio 2015)

如果通过 获得最高值auto & m = queue.top();,则输出也是3 2 1

而如果通过 获得最高值auto m = queue.top();,则输出为3 3 3

这背后的机制是什么?

0 投票
1 回答
343 浏览

c++ - 在 C++ 中通过 const 引用返回接收器函数复制值是否值得?

我有这种情况,如果通过 const 参考剂量继电器返回保存一些东西,我会徘徊,这个函数可能会被调用数百次。

我有:
返回 int 作为 const 引用的通用容器

获取数字的函数:

调用 d oSomthing().toInt()

在这种情况下,是否有任何理由使用 const 引用来节省一些位?

0 投票
2 回答
95 浏览

c++ - 允许预先计算和即时计算结果

考虑:

T::f必须计算所需的向量。然而,有些T人预先计算了向量,我们希望避免在这种情况下创建副本。这是我的尝试:

正如注释中main指出的那样,对于T=A,上面的代码是错误的,因为它返回了对局部变量的引用。我怎样才能同时容纳T=Aand T=B,这样预先计算的向量B::v_就不会被复制?

0 投票
2 回答
659 浏览

c++ - 带有指针、引用和常量引用参数的函数调用歧义

我想做的是,允许使用 setter 函数传递指针、引用或常量引用:

但是我已经看到,如果指针版本不存在,则setS(0)调用函数的const std::string&版本。setS()

指针和参考版本之间或其他任何重要的版本之间是否存在歧义?它是否定义明确并期望在所有编译器中以相同的方式工作?