问题标签 [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.
c++ - const 引用函数参数的地址何时是唯一的?
在下面的示例代码中,我想知道两个调用何时log_cref_address
会可靠地打印相同的地址。
在我的机器上,main
打印
从许多这样的输出中,我观察到其main
行为如下:
- 前三个调用
foo
打印相同的地址。 - 最后两次调用
foo
(来自线程)打印前三个调用未打印的地址。 - 在对 的最后两次调用中
foo
,log_cref_address
当且仅当从子线程调用时打印相同的地址。
在任何机器上,哪些行为(如果有)是由 C++ 标准保证的?
c++ - 当 const 引用参数绑定到右值时,它是否保持其“状态”?
设为T
任意类型。考虑一个采用const
[lvalue] 引用的函数:
假设此函数在内部调用另一个函数,该函数具有右值引用重载:
如果我们将 rvalue 传递给f
,是否会调用 rvalue 引用重载g
,还是会因为它已“转换”/绑定到const
左值引用而无法调用?
类似地,如果f
调用一个T
按值获取实例的函数,
并且T
有一个移动构造函数(即T(T &&);
),将调用移动构造函数,还是调用复制构造函数?
总之,如果我们想确保在调用f
右值时,传递右值引用以保持其右值“状态”,我们是否必须提供右值引用重载f
?
c++ - 编译器在不需要复制构造函数时会关心它
为什么编译器在不需要复制构造函数时会关心它?
函数print
被重载以接受const Foo&
但编译器产生以下编译错误:
为什么会这样?显然我们不需要复制构造函数,因为我们通过foo
引用传递并且我们有重载print
。
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)
c++ - 为什么 string_view::operator== 按值接受参数
我正在阅读 string_view 的源代码,发现 operator== 按值接受参数。
为什么它按值接受参数,而不是通过 const 引用?
c++ - 通过非常量引用参数修改 const 引用参数
考虑以下代码:
- 函数
f
有两个引用参数:int const& a
和int& b
. 因此,f
应该不修改a
,但可以修改b
,而且确实可以。 - 但是,在 中
main
,我传递了由和引用的同一个变量。作为修改,它也修改,它应该不应该修改a
b
f
b
a
此代码在没有任何警告的情况下编译并打印3
. 如果我们单独跟踪每个变量,看起来 const 正确性受到尊重:c
是非常量的,因此将它作为const
ref as传递a
,也可以作为非常量ref as 传递,并且在我们b
的主体内传递它是完全可以的f
modify b
,它是非常量的,而不接触a
,它是 const 。然而,当c
asa
和 as使用时b
,a
在 的主体内被修改f
,违反了 const 的假设a
,即使没有const_cast
调用显式。
我尽可能简单地制作了这个示例,但人们很容易想到不那么明显的用例(例如const
作用于非常量引用参数的方法)。
我的问题是:
- 我们真的可以说上面的代码是 const 正确的吗?
- 上述用例是已知模式吗?它被认为是不好的做法吗?
- 除了让读者感到困惑之外,上面的代码是否会成为技术问题的根源?例如未定义的行为,或者编译器执行错误的简化假设?
c++ - C++ const 引用模板函数参数类型本身就是一个引用,为什么?
我有以下功能:
但是,我遇到的问题是编译器告诉我 T 实际上不是它的任何类型,而是对它的引用。这怎么可能,在什么情况下 const 引用的模板参数本身引用?
请注意,我可以通过以下方式解决上述问题:
但我想了解 T 本身在什么情况下可以作为参考。
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 类型的大小很大,这可能会花费更多。有解决方法吗?
c++ - 参考 std::thread 参数
我有两个功能
我会做
但是我不能创建std::thread t2(g, x)
,在这种情况下我需要 makestd::ref(x)
而不是 just x
,为什么有必要?
为什么可以在t1
没有的情况下进行创建std::cref
?