问题标签 [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 回答
9488 浏览

c++ - 将右值引用传递给 const 左值引用参数

我试图了解 C++11右值引用以及如何在我的代码中使用它们以获得最佳性能。

假设我们有一个类A,它有一个指向大量动态分配数据的成员指针。

此外,一种foo(const A& a)对 class 对象执行某些操作的方法A

我想防止在将A对象A传递给函数时调用foo复制构造函数,因为在这种情况下,它将执行底层堆数据的深层复制。

我测试了传递左值引用:

并传递一个右值引用:

在这两种情况下,复制构造函数都没有被调用。

这是预期的还是由于我的编译器(Apple LLVM 5.1)的一些优化?有这方面的规范吗?

0 投票
1 回答
632 浏览

c++ - 为什么引用不能捕获临时而 const ref 和 rval ref 可以

为什么引用不能捕获临时值,而 const 引用和右值引用可以捕获并延长对象寿命。换句话说,虽然前两行是合法的,但第三行不合法:

0 投票
1 回答
735 浏览

c++ - 返回子类的 const 引用

我知道的

我知道返回临时对象的 const 引用是可以的!(像这个例子:)

返回临时对象并绑定到 const 引用

但!

如果我想这样做,它仍然是正确的:

我认为是的,但在执行时,返回的对象仍被视为 A 对象(如本例中所示:)

主文件

输出

这是一个 B.. 是的.. 但是这个警告是相当可怕的....

编辑

谢谢你,我知道我的错误......但我想知道其他一些事情......

执行此操作时,堆栈中到底发生了什么?

0 投票
1 回答
261 浏览

c++ - 当 const 引用绑定到临时变量时,堆栈中会发生什么?

C++ 标准允许将 const 引用绑定到右值,从而延长临时的生命周期,直到引用超出范围。但是,我无法弄清楚它实际上是如何编译的,让我用一个例子来解释一下:

据我所知,以 x86 架构为例,首先foo()调用函数并在堆栈中构造字符串对象,这意味着从rsp寄存器中减去所需的空间量(假设 64位架构);之后,rsp寄存器返回其原始值,释放函数foo()正在填充的堆栈空间,如果我理解正确,调用bar()将使用该堆栈空间来构造VeryBigObject,这将覆盖字符串。

考虑到这一切,如何foo()在汇编域中调用 to 后延长字符串的生命周期?

0 投票
4 回答
787 浏览

c++ - 临时绑定 const&:没有编译器警告?

我有TestClass一个const&成员变量。我从不同的地方和自己的经验中知道,const&使用临时值的引用来初始化它是一个坏主意。所以我很惊讶下面的代码可以很好地编译(用gcc-4.9.1,clang-3.5和测试scan-build-3.5)但是不能正常运行。

为什么两个编译器都没有在编译时警告我?另请参阅此ideone,正在进行更多测试。

0 投票
0 回答
25 浏览

c++ - 传递临时参数时,常量引用参数会发出警告

以下代码警告我将临时参数作为参数传递给接受引用的函数:

这让我感到困惑,因为Function实际上是在接受一个const TempObject::reference. 更改 to 的定义TempObject::referencetypedef const TempObject& reference导致编译器不再发出警告。

为什么有区别?我在 Microsoft 和 Intel 的编译器中发现了这种行为。

0 投票
1 回答
670 浏览

c++ - 使用 const 引用给变量起别名

在处理T从数组或通过任何其他冗长语法获得的实例时,我经常使用 aconst T&给对象起别名并使我的代码更具可读性(当然只有在对象的生命周期允许的情况下)。我在其他地方看到过这个,例如Stefan Reinalter 的优秀博客上。剥离并注释了他的代码版本:

这是否会导致额外的指令,或者这在所有情况下都m_subMeshes[i].startIndexm_subMeshes[i].numIndices直接访问相同吗?

0 投票
1 回答
315 浏览

c++ - 类型转换时 Visual Studio 没有创建临时对象?

我正在使用 Visual Studio Express 2013,并且正在尝试了解 C++ 中的不同内容。

我在编译器中偶然发现了一个有趣的错误,当显式类型转换为与引用相同的类型时,它似乎没有创建临时对象。

这将在 VS 中编译时产生以下输出:3 3 2 2

但是用 gcc 编译,结果如下: 3 2 2 2

如果我替换“int number;” 带有“浮点数;” 我进入 VS:2 2 3 3

并使用 gcc:2 2 3 2

我想知道是否有人可以确认这是一个错误,以及是否有人知道可行的解决方法/解决方案。

0 投票
1 回答
394 浏览

c++ - const 字符串引用作为非类型模板参数

我试图将 const 字符串引用作为非类型模板参数,我无法克服这个编译错误。

测试.h:

测试.cpp:

编译错误:

我正在使用以下 gcc 命令在 centos linux 上编译

0 投票
2 回答
379 浏览

c++ - 构造函数和常量引用

我现在正在学习 C++(从 2 天前开始),我在编写 Node.js 的 Copy C'tor 时遇到了一些麻烦。Node 是一个类,如下所示:

注意:我有 operator* 所以 *dummy 结果为 T 类型。

另一个注意事项:我的公共和私人领域可能是错误的 - 但我稍后会处理它。

在你吐了一点之后,让我们看看 Copy C'tor。

它获得了 Node 的 const 引用,然后我尝试创建一个指向它的指针。编译器输出错误: Node<T>* dummy= &node;结果invalid conversion from 'const Node<int>*' to 'Node<int>*'(我有一个简短的 main 试图创建Node<int>)。

好的,所以似乎我无法创建指向 const 的指针,所以我尝试手动复制它的字段,如代码所示。当我运行 Eclipse 调试器并检查它是否有效时 - 它确实有效。但是,当我继续执行步骤时,会直接调用 D'tor (在复制构造函数的末尾),结果一切都崩溃了。所以我不知道下一步该做什么,或者即使我的方式是正确的。

我应该如何制作复制构造函数?我想我理解为什么要调用 D'tor(我创造了一些东西,在块的末尾,一些东西被破坏了 - 对吗?),但我不知道如何使它正确。