问题标签 [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++ - 将右值引用传递给 const 左值引用参数
我试图了解 C++11右值引用以及如何在我的代码中使用它们以获得最佳性能。
假设我们有一个类A
,它有一个指向大量动态分配数据的成员指针。
此外,一种foo(const A& a)
对 class 对象执行某些操作的方法A
。
我想防止在将A
对象A
传递给函数时调用foo
复制构造函数,因为在这种情况下,它将执行底层堆数据的深层复制。
我测试了传递左值引用:
并传递一个右值引用:
在这两种情况下,复制构造函数都没有被调用。
这是预期的还是由于我的编译器(Apple LLVM 5.1)的一些优化?有这方面的规范吗?
c++ - 为什么引用不能捕获临时而 const ref 和 rval ref 可以
为什么引用不能捕获临时值,而 const 引用和右值引用可以捕获并延长对象寿命。换句话说,虽然前两行是合法的,但第三行不合法:
c++ - 返回子类的 const 引用
我知道的
我知道返回临时对象的 const 引用是可以的!(像这个例子:)
但!
如果我想这样做,它仍然是正确的:
我认为是的,但在执行时,返回的对象仍被视为 A 对象(如本例中所示:)
主文件
输出
这是一个 B.. 是的.. 但是这个警告是相当可怕的....
编辑
谢谢你,我知道我的错误......但我想知道其他一些事情......
执行此操作时,堆栈中到底发生了什么?
c++ - 当 const 引用绑定到临时变量时,堆栈中会发生什么?
C++ 标准允许将 const 引用绑定到右值,从而延长临时的生命周期,直到引用超出范围。但是,我无法弄清楚它实际上是如何编译的,让我用一个例子来解释一下:
据我所知,以 x86 架构为例,首先foo()
调用函数并在堆栈中构造字符串对象,这意味着从rsp
寄存器中减去所需的空间量(假设 64位架构);之后,rsp
寄存器返回其原始值,释放函数foo()
正在填充的堆栈空间,如果我理解正确,调用bar()
将使用该堆栈空间来构造VeryBigObject
,这将覆盖字符串。
考虑到这一切,如何foo()
在汇编域中调用 to 后延长字符串的生命周期?
c++ - 临时绑定 const&:没有编译器警告?
我有TestClass
一个const&
成员变量。我从不同的地方和自己的经验中知道,const&
使用临时值的引用来初始化它是一个坏主意。所以我很惊讶下面的代码可以很好地编译(用gcc-4.9.1
,clang-3.5
和测试scan-build-3.5
)但是不能正常运行。
为什么两个编译器都没有在编译时警告我?另请参阅此ideone,正在进行更多测试。
c++ - 传递临时参数时,常量引用参数会发出警告
以下代码警告我将临时参数作为参数传递给接受引用的函数:
这让我感到困惑,因为Function
实际上是在接受一个const TempObject::reference
. 更改 to 的定义TempObject::reference
会typedef const TempObject& reference
导致编译器不再发出警告。
为什么有区别?我在 Microsoft 和 Intel 的编译器中发现了这种行为。
c++ - 使用 const 引用给变量起别名
在处理T
从数组或通过任何其他冗长语法获得的实例时,我经常使用 aconst T&
给对象起别名并使我的代码更具可读性(当然只有在对象的生命周期允许的情况下)。我在其他地方看到过这个,例如在Stefan Reinalter 的优秀博客上。剥离并注释了他的代码版本:
这是否会导致额外的指令,或者这在所有情况下都m_subMeshes[i].startIndex
与m_subMeshes[i].numIndices
直接访问相同吗?
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
我想知道是否有人可以确认这是一个错误,以及是否有人知道可行的解决方法/解决方案。
c++ - const 字符串引用作为非类型模板参数
我试图将 const 字符串引用作为非类型模板参数,我无法克服这个编译错误。
测试.h:
测试.cpp:
编译错误:
我正在使用以下 gcc 命令在 centos linux 上编译
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(我创造了一些东西,在块的末尾,一些东西被破坏了 - 对吗?),但我不知道如何使它正确。