问题标签 [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 投票
4 回答
406 浏览

c++ - 是否有任何 C++ 编译器可以针对悬空引用发出警告?

给定以下代码,其中xdanglingconst reference是一个消失的对象,因此是未定义的行为。

似乎GCC 7.3Clang 6.0MSVC都无法发出警告,即使启用了所有警告。有谁知道在这些情况下是否可以发出警告?在这些情况下const auto&和之间有什么区别吗?auto&&

注意,如果back()按值返回,它不会是未定义的行为,因为生命周期临时对象 x 被扩展为函数 scoop。

长话短说:我有一个代码库,const auto&用作初始化变量的默认方式,出于某种奇怪的原因,这些案例使用 MSVC 正确执行,但是当使用 Clang for android 编译时,每次出现都会导致错误分配的值。目前,该解决方案似乎调查const auto&了整个代码库中的每一个。此外,在许多情况下,const auto&引用引用返回的重对象,因此简单地删除&不是解决方案。

还有一件事,我负责误用const auto&:)

0 投票
1 回答
39 浏览

c++ - 是否参考右值

我想知道下一个代码是否可以使用 v 和 v2 变量正确工作,或者这些是临时变量的引用?换句话说,我可以通过引用捕获返回的右值吗?我不认为,但我的团队负责人认为另一种方式。

0 投票
1 回答
46 浏览

c++ - 与引用一起使用的列表,用作成员时更改行为

试验这个问题/答案https://stackoverflow.com/a/50649120/225186我产生了一个似乎是实现循环列表的合法递归自引用类:

但是,当我尝试将其作为更大类的成员时,我会收到来自编译器的警告并且行为会发生变化。

我得到的警告是gcc: warning: a temporary bound to ‘A::n’ only persists until the constructor exits [-Wextra]. 我不相信警告是正确的,但是它与后来的运行时错误一致。

我承认这个类是非常规的,但是,一个类怎么会改变一个类内部的行为呢?

我错过了什么吗?

0 投票
1 回答
199 浏览

c++ - 在运算符重载中使用带有 const 引用的友元函数

下面的代码无法编译。但是,当我从朋友函数的 Point& 中删除“const”时,此代码将被编译。任何人都可以解释原因吗?

0 投票
1 回答
2069 浏览

c++ - 在类成员函数中将 const 引用作为函数参数传递

假设我们有一个名为的类Line,其中包含以下修饰符,该修饰符将值分配给类数据成员。

void Start(const Point &start);

line 类包含两个名为 start 和 end 的数据成员,它们都是 Point 对象。由于start函数参数中的变量是引用,我实现如下:

void Line::Start(const Point &start) { m_start = start; }

在主要功能中,我有以下内容。

Line line; Point start(1, 1); line.Start(start);

m_start数据成员现在是否会直接start Point引用主函数中的对象,因为它是通过引用传递的?

0 投票
3 回答
834 浏览

c++ - 如何为模板类的 const ref 成员定义移动赋值运算符

我有以下模板类,其中成员是const ref类型。对象的复制被禁用,只需要移动 cntor 和移动赋值运算符。

Q1:如何正确实现移动赋值运算符const ref type(是否正确,我所做的)?

Q2:为什么会这样

发生了?

Q3:在main()移动的实例中可以调用 using print()。是UB吗?

我正在使用Visual Studio 2015 (v140)。这是我的代码:

0 投票
0 回答
126 浏览

c++ - const 引用作为类的成员不一致

如果创建一个对临时对象的 const 引用,它的寿命就会延长,就像引用在堆栈中的位置一样。这是该语言的一个很好的特性,尽管它有时会像其他规则的例外一样出现。 https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

但是,当 const 引用是类成员的一部分时,这不起作用。这是语言不一致吗?

示例代码:

是否有一种解决方法可以使其工作或至少表现得更一致?

我发现这在现在的一些情况下是一个限制因素。例如,List using with references,在用作成员时更改行为https://stackoverflow.com/a/51878764/225186


EDIT1:在其他类似问题的答案中提到,问题在于构造函数采用了const&规则不适用的地方。然而,一个完美的前锋仍然失败。在这种情况下,要么语言的不一致更加明显,要么完美的前锋不那么完美。


EDIT2:声明single const& s{f(3)};仍然无济于事。但是,将常量“移动”到结构会有所帮助。

因此,将常量转移到整个结构也许是一种好习惯。

我仍然认为参考成员在语言中的行为很奇怪。https://www.youtube.com/watch?v=uYDt1gCDxhM


EDIT3:正如@Oliv 提到的,如果使用聚合初始化,情况会有所改善。然而,这是相当有限的。

0 投票
3 回答
795 浏览

c++ - C++ 中 const 引用对象的条件赋值

这是一个说明我的问题的代码片段:

如何在 if else 块之后访问reward对象?foo3()这是避免代码重复所必需的。

提前致谢 !

0 投票
1 回答
73 浏览

c++ - 如何使具有引用数据成员的类可以在没有参数的情况下构造?

我有一个类,比如 C,其中一个成员数据,比如 X,取决于用户输入。每次运行时用户输入可能不同,在我当前的设计中,我的类的所有实例都存储对同一个对象 X 的引用。

我如何调整设计以使其允许不带参数的默认构造函数?

这样我可以使用复制赋值/复制构造函数,制作 C 数组,使用临时右值等。

以下是说明我的问题的最小工作示例。在我使用的情况下,Tag 指的是一些外部资源。

0 投票
0 回答
52 浏览

c++ - 为什么 const 引用会抑制 C++ 中的自动转换

在“Introduction to Design Patterns in C++ with Qt”一书中,我发现“通过 const 引用传递仍然稍微快一些,这使得 C++ 可以完全优化复制操作。使用 const 引用,函数无法更改引用,并且不会发生自动转换。”

“不会发生自动转换”是什么意思?