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

c++ - const 引用函数参数的地址何时是唯一的?

在下面的示例代码中,我想知道两个调用何时log_cref_address会可靠地打印相同的地址。

在我的机器上,main打印

从许多这样的输出中,我观察到其main行为如下:

  1. 前三个调用foo打印相同的地址。
  2. 最后两次调用foo(来自线程)打印前三个调用未打印的地址。
  3. 在对 的最后两次调用中foolog_cref_address当且仅当从子线程调用时打印相同的地址。

在任何机器上,哪些行为(如果有)是由 C++ 标准保证的?

0 投票
2 回答
34 浏览

c++ - 当 const 引用参数绑定到右值时,它是否保持其“状态”?

设为T任意类型。考虑一个采用const[lvalue] 引用的函数:

假设此函数在内部调用另一个函数,该函数具有右值引用重载:

如果我们将 rvalue 传递给f,是否会调用 rvalue 引用重载g,还是会因为它已“转换”/绑定到const左值引用而无法调用?

类似地,如果f调用一个T按值获取实例的函数,

并且T有一个移动构造函数(即T(T &&);),将调用移动构造函数,还是调用复制构造函数?

总之,如果我们想确保在调用f右值时,传递右值引用以保持其右值“状态”,我们是否必须提供右值引用重载f

0 投票
2 回答
85 浏览

c++ - 编译器在不需要复制构造函数时会关心它

为什么编译器在不需要复制构造函数时会关心它?

函数print被重载以接受const Foo&但编译器产生以下编译错误:

为什么会这样?显然我们不需要复制构造函数,因为我们通过foo引用传递并且我们有重载print

0 投票
2 回答
91 浏览

c++ - 错误:使用复制和交换习语的交换函数中“operator=”的重载不明确

在具有常量引用作为成员的类中使用复制和交换习语时,会发生上述错误。

示例代码:

当 Copy 赋值运算符被更改为通过引用而不是按值获取其参数时,该错误已得到修复。

为什么这可以修复错误?一种可能的含义是链接问题中引用的重要优化可能性丢失了。参考文献是这样吗?这种变化的其他影响是什么?

有一个依赖此运算符的代码库,不存在其他成员,只有提到的引用。是否需要以某种方式使代码库适应这种变化,或者它是否安全?

0 投票
1 回答
114 浏览

c++ - Can we have a setter member function as const referenced from a const object?

I have a class like this :

I want to know that if my objects for XYZ are referenced as const everywhere in my codebase, can I use these setters? P.S. I have tried with const Setters and it doesn't work (I knew it doesn't make much sense but I was stuck in the compilation error so tried it anyway)

0 投票
2 回答
58 浏览

c++ - 为什么 string_view::operator== 按值接受参数

我正在阅读 string_view 的源代码,发现 operator== 按值接受参数。

为什么它按值接受参数,而不是通过 const 引用?

0 投票
4 回答
1957 浏览

c++ - 通过非常量引用参数修改 const 引用参数

考虑以下代码:

  • 函数f有两个引用参数:int const& aint& b. 因此,f应该不修改a,但可以修改b,而且确实可以。
  • 但是,在 中main,我传递了和引用的同一个变量。作为修改,它也修改,它应该不应该修改abfba

此代码在没有任何警告的情况下编译并打印3. 如果我们单独跟踪每个变量,看起来 const 正确性受到尊重:c是非常量的,因此将它作为constref as传递a,也可以作为非常量ref as 传递,并且在我们b的主体内传递它是完全可以的fmodify b,它是非常量的,而不接触a,它是 const 。然而,当casa和 as使用时ba在 的主体内被修改f,违反了 const 的假设a,即使没有const_cast调用显式。

我尽可能简单地制作了这个示例,但人们很容易想到不那么明显的用例(例如const作用于非常量引用参数的方法)。

我的问题是:

  • 我们真的可以说上面的代码是 const 正确的吗?
  • 上述用例是已知模式吗?它被认为是不好的做法吗?
  • 除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?
0 投票
1 回答
189 浏览

c++ - C++ const 引用模板函数参数类型本身就是一个引用,为什么?

我有以下功能:

但是,我遇到的问题是编译器告诉我 T 实际上不是它的任何类型,而是对它的引用。这怎么可能,在什么情况下 const 引用的模板参数本身引用?

请注意,我可以通过以下方式解决上述问题:

但我想了解 T 本身在什么情况下可以作为参考。

0 投票
1 回答
137 浏览

swift - 为什么我们不能在 swift 中通过引用 inout 函数来传递 const 值?

在 C 中,虽然我们将值声明为const int a = 5;,但我们可以传递&a给声明为 的函数void someFun(const int *);

根据经验,在 C 语言中,当不需要更改原始值时,i) 如果对象的大小小于或等于指针的大小,则按值传递,ii) 否则按将整个值复制到函数的 const 引用会占用更多资源。

但是在 swift 中,即使 inout 参数没有在函数中修改,我们也不能将声明为的值传递给声明为let a = 5的函数someFun(_ z: inout Int) -> ()。因此,我们必须将函数中的 z 标记为 let。这会将整个值复制到函数中。如果 a 类型的大小很大,这可能会花费更多。有解决方法吗?

0 投票
1 回答
172 浏览

c++ - 参考 std::thread 参数

我有两个功能

我会做

但是我不能创建std::thread t2(g, x),在这种情况下我需要 makestd::ref(x)而不是 just x,为什么有必要?

为什么可以在t1没有的情况下进行创建std::cref