问题标签 [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.
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 之间的区别。而且它不会以任何方式波动,在这个特定的例子中它是完全可重现的。执行时间存在显着差异。
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::string
at const ref 很好。它在 C++11 中如何?
更新(2016-07-27 2:10 GMT+0):
抱歉,我的问题不准确。我的意思是编码风格 - 是添加更好const &
还是只留下来auto
让编译器做它想做的任何事情。
更新示例:
两种方法:
对比
问题:我们应该
- 用于
const auto&
存储复杂的返回对象和auto
原语,或 - 使用
auto
一切来保持 Herb 在他的演示文稿中提到的从左到右的现代 C++ 风格(上面的链接)。
c++ - 对 unsigned int 中转换的 int 的 const 引用
我在理解此代码段中的行为时遇到了一些麻烦:
第一个打印语句按我的预期给出了 2,但是当我更改引用变量的值时,它不会反映在引用中。第二个打印语句也给出 2,但我认为它应该给出 100?
如果我将变量i
转换为 typeint
而不是unsigned int
,它会按我的预期工作。这里发生了什么?
c++11 - 定义的函数返回对类成员的 const 引用和变量的副本
返回一个 const 引用,我仍然有点困惑。可能,这已经讨论过了,但是让我们有以下代码,因为我没有找到相同的代码:
究竟会发生什么,当我打电话
这个对吗?从我的角度来看,它是并且制作了所请求结构的副本,对吗?
另一方面,
返回对对象成员的引用,这是正确的,除非 T 对象没有被破坏。我对吗?
c++ - 模板化的数学函数应该采用值还是 const 引用?
假设我想实现一些简单的数学函数;例如,假设它是 (C++17's) 的重新实现std::clamp
:此函数接受一个数字、一个下限和一个上限,如果它超出了它们定义的范围,则将该数字设置为这些边界之一。如果它是一个具体的数字类型,比如说int
,我会写:
但如果它是一个模板,我看到可能是标准将使用的示例实现const&
使用's 而不是值。因此,使引用变得更简单,例如:
我的问题是:
- 使用 const 引用有什么好处,因为
T
's 是简单的数字类型? - 同上,对于将单个数字包装为数据成员(例如
std::chrono
持续时间)的一些抽象事物的类型? - 为什么在
const&
任何相对简单的(constexpr?)无副作用的数学函数的一般情况下取一个值是一个更好的主意?
笔记:
- 我意识到,
const&
当您拥有某种 k 维向量类型或boost::rational
s 和其他类似数字的类型时,可能会开始有意义;但即便如此,编译器不会优化复制吗? - 我不是在问任何任意的 C++ 函数,以及它是否应该只按值获取参数,这显然是个坏主意。
c++ - 从 lambda 返回局部变量到 const ref
可以像这样在 const ref 中捕获结果吗?
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
。
这背后的机制是什么?
c++ - 在 C++ 中通过 const 引用返回接收器函数复制值是否值得?
我有这种情况,如果通过 const 参考剂量继电器返回保存一些东西,我会徘徊,这个函数可能会被调用数百次。
我有:
返回 int 作为 const 引用的通用容器
获取数字的函数:
调用 d oSomthing().toInt()
:
在这种情况下,是否有任何理由使用 const 引用来节省一些位?
c++ - 允许预先计算和即时计算结果
考虑:
T::f
必须计算所需的向量。然而,有些T
人预先计算了向量,我们希望避免在这种情况下创建副本。这是我的尝试:
正如注释中main
指出的那样,对于T=A
,上面的代码是错误的,因为它返回了对局部变量的引用。我怎样才能同时容纳T=A
and T=B
,这样预先计算的向量B::v_
就不会被复制?
c++ - 带有指针、引用和常量引用参数的函数调用歧义
我想做的是,允许使用 setter 函数传递指针、引用或常量引用:
但是我已经看到,如果指针版本不存在,则setS(0)
调用函数的const std::string&
版本。setS()
指针和参考版本之间或其他任何重要的版本之间是否存在歧义?它是否定义明确并期望在所有编译器中以相同的方式工作?