问题标签 [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 引用的可变参数模板特化
如何专门化具有参数的 const 引用的可变参数模板函数?
例子:
当使用声明的参数调用函数 foo 时const Test&
,编译器看不到专门的函数并回退到已删除的函数:
如果我从参数中删除 const 引用,上面的代码编译得很好。我究竟做错了什么?
代码可以在这里找到
c++ - 为什么不调用具有 const 引用返回值的重载方法?
考虑以下代码:
我希望第二次和第三次调用a.get_ref()
运行第二个版本的get_ref()
方法(并const
在标准错误上输出)。但看起来总是第一个版本被调用。如何实现两个不同的“getter”并确保根据上下文调用正确的版本?即,至少对于第三次通话
第二个版本执行?(一个不优雅的解决方案是使用不同的名称,例如get_ref
,get_const_ref
但我想看看是否可以避免这种情况。)
c++ - 是否对 STL 容器未定义行为的已擦除元素使用右值引用?
我的程序的一部分是这样的:
该程序应该可以在 linux 和 windows 之间移植。当使用 g++ 编译时,程序运行良好并返回 10,正如预期的那样。但是,当使用 VS 2017 编译时,程序中止,抛出 std::out_of_range。通过最简单的调试工作,我看到i
in 函数m
在调用G.at
. (都没有优化)
据我了解,对 const 的引用v.begin()
应该在返回之前过期m
(g++ 案例)。但它的 MSVC 显然不同意这一点。
这个未定义的行为或实现是否已定义?实际上,由 const 引用传递的参数什么时候过期呢?
c++ - 第二个常量引用可以延长临时对象的寿命吗
- 背景:
我注意到 std::max 的签名是:
模板<typename T>
const T& max(const T&, const T&);
我想知道返回对 const T 的引用的含义...
如果我们传入两个 L 值,那么我们可以返回对这两个值之一的引用是有意义的。但是如果我们传入两个 PR 值,返回的是什么,使用它是否安全?
问题:
我与一些同事交谈,这里是这个问题的一个最小的工作示例:http: //cpp.sh/4en4
没有优化:
适度:
使用不同级别的优化运行它会产生不同的结果。但是,在所有情况下,返回引用似乎都不会延长本地对象的生命周期。它的析构函数仍然被调用,尽管在一种情况下我们似乎恢复了对被破坏对象的引用,而在另一种情况下,我们似乎有一个悬空指针。
标准:
引用 C++ 标准,文档编号 N4618:
12.2 第 6 项:
...当引用绑定到临时。引用绑定到的临时对象或引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,但以下情况除外:
(6.1) — 在函数调用中绑定到引用参数的临时对象(5.2.2) 一直持续到包含调用的完整表达式完成。
(6.2) — 在函数返回语句 (6.6.3) 中临时绑定到返回值的生命周期没有延长;临时在 return 语句中的完整表达式结束时被销毁。”
从 (6.1) 开始,对于初始化 b 的整个语句,似乎应该存在一个临时的 foo(2)。
从 (6.2) 开始,似乎本地 'a' 被破坏了,这实际上破坏了临时 foo(2),导致 b 具有破坏值。
我的问题:
1a。什么是包含由
foo(2)
in生成的临时的完整表达式const temp& b = foo(2);
1b。第二个 const 引用可以延长临时对象的生命周期吗?
- 考虑到明显的危险,为什么要这样实现 std::max ?
c++ - 为什么对字符串参数的 const 引用可以采用字符串文字?
为什么对字符串参数的 const 引用可以采用字符串文字?字符串文字,如"hello"
,不是变量,那么为什么这段代码有效?
首先,我认为引用作为参数用于避免复制过程并直接访问作为参数的变量(尽管我仍然可能是正确的)。但是字符串文字“asdas”不是变量,那么为什么参数可以将字符串文字作为参数呢?我的意思是,由于参数str
是一个引用,它将成为该实体的别名,对吧?如果是这样,文字是否只是变成了一个变量?
参数列表不应该由string& str
const 引用而不是 const 引用组成,以便将文字用于构造str
?
只要引用还活着,常量引用就不会使被引用的实体保持活动状态吗?如果是这样,您为什么要对文字这样做?
c++ - C++ 引用返回和常量引用返回值被复制
我对返回类成员变量的引用有一些疑问。
我有以下代码:
我注意到如果我这样做:
变量
returned
得到一个副本,而不是一个引用,为什么?const std::set<uint32_t> & GetValues () const
函数是否必须包含双精度const
(返回值上的一个和函数名后面的一个)?
编辑:附加问题:
知道这
std::set<uint32_t> returned = test.GetValues ();
会创建一个副本。如果我这样做:为了调用
size ()
函数(或返回对象的任何其他成员),是临时创建一个副本还是全部使用返回的引用解析?拥有三个函数,按值返回、按常量引用和按引用返回是不是很糟糕?
/li>
c++ - C++ 声明 const 变量,但推迟初始化?
上下文:
一个函数(来自一些我无法修改的 API)从 objectRegistry 返回一个对对象的常量引用:
我需要获取常量 Foo 对象,但我需要基于某些条件的 Foo 的不同实例。
天真地,我首先声明 f 返回什么,然后调用 f 来初始化变量 foo。
这将不起作用,因为这将首先(我假设)调用带有空参数的构造函数。之后,您有一个无法覆盖的 const 对象。相反,编译器立即抱怨:error: 'foo' declared as reference but not initialized
. 如果将 foo 声明为const Foo foo;
以下确实有效。
问题:
- 除了丑陋(imo)之外,这种方法有什么问题吗?
- 有更好的方法来达到同样的目的吗?
一些相关的主题:
c++ - 这个奇怪的复制构造函数错误在抱怨什么?
我在 Visual Studio 2017 上。最近,因为我不喜欢 C++ 的不符合标准,所以我继续并禁用了选项中的非标准语言扩展。到目前为止,一切都很好。现在我有一个问题。
这不会在 Visual Studio 中编译,它给出的唯一错误是:
“编译器发生内部错误”
如果我启用语言扩展,它编译得很好。如果我保持禁用语言扩展并使复制构造函数采用const Vertex&
它可以很好地编译。
因此,我在一些在线编译器上尝试了 GCC,如果复制构造函数不采用 const 引用参数,它将无法编译,从而产生各种错误。似乎最有意义的是:
错误:从“Vertex”类型的右值对“Vertex&”类型的非常量引用的初始化无效</p>
我认为复制构造函数不必是 const,就我而言,我想修改其他参考中的某些内容。我知道非常量参数不能采用 r 值引用,但我对其进行了测试,结果发现在vector::emplace_back()
复制构造函数中根本没有被调用:
所以我不知道发生了什么。我首先想知道如果没有调用复制构造函数,为什么会发生这种情况,以及在这种情况下是否有办法在我的复制构造函数中使用非常量,即使用vector::emplace_back()
,因为这似乎是这个问题仅使用vector::emplace_back()
.
c++ - C ++将 const& 存储到临时
最近我在一个项目中遇到了一个问题。那里的代码比下面的例子复杂得多,但我希望问题(如果有的话)是一样的。
这给了我以下代码:
所以原来的“临时”mObject
实例在使用它之前func2
就死了。object
我认为如果有的话,临时的寿命会延长const&
。将返回分配giveme()
给本地const&
函数main
解决了这个问题。然后临时生命直到main
' 范围结束。那么这里发生了什么???
c++ - 如果可能,优化 InputIterator 取消引用而不制作副本?
我有一个遗留代码,其中接口仅为指针定义,我正在尝试调整一些函数以采用迭代器。
在这个问题的答案中Address of a dereferenced InputIterator?
注意到istream_iterator 的情况std::istream_iterators
是InputIterator
. 但是它们在InputIterator
s 中是特殊的,因为它们的取消引用保证生成语言引用T const&
。
通用输入迭代器的代码如下所示,请注意,我必须生成值类型的副本才能获取地址。
然而,std::istream_iterator
这不是最佳的,因为会制作不必要的副本。(我不知道它是否可以优化,但这是另一个问题。)所以我可以添加一个重载来处理istream_iterator
.
或更详细
问题是,我可以只使用以下版本f
而不编写重载istream_iterator
吗?
我认为这应该是由于https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/,但我不确定它是否适用。
甚至这一个班轮:
注意:在实际代码中,所有函数都是模板化的,double
这里只是一个占位符。