我希望我的函数采用左值引用,而绝对不是右值或临时值或其他任何值。
这是我的功能:
template<class T>
void foo(T& value) {}
// Imagine I have a class Foo
struct Foo
{
int a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
当我调用 时foo(Foo{1, 2})
,首先,即使我要求左值引用,它也会编译,其次,它不起作用,因为foo
存储了传递值的地址,所以我稍后阅读时会得到垃圾。
如何强制foo
采用左值引用?
以下代码将“我的字符串”分割为vector<string>
:
std::stringstream ss{"my string"};
std::vector<std::string> vec;
std::string tmp;
while (std::getline(ss, tmp, ' ')) {
vec.push_back(tmp);
}
Run Code Online (Sandbox Code Playgroud)
我了解的是getline
将其结果写入向量tmp
,然后tmp
通过复制将其推入向量。但是这样做会更有效,vec.push_back(std::move(tmp))
所以我们避免了复制吗?
我不明白关于其成员具有默认值的结构的零初始化会发生什么。
如果我有这些结构:
struct A {
int *a;
int b;
};
struct B {
int *a;
int b;
B() : b(3) {}
};
struct C {
int *a;
int b = 3;
};
Run Code Online (Sandbox Code Playgroud)
毫无疑问,我们可以说的是:
A a;
使所有字段未初始化A a{};
是 {nullptr, 0}B b;
并且B b{};
都是 {garbage, 3} (构造函数被调用)现在还不清楚当我执行以下操作时会发生什么,以下是使用 gcc 的结果:
C c; // {garbage, 3}
C c{}; // {nullptr, 3}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:不C c{};
保证该C::a
被初始化为nullptr
,换句话说,不会有像在默认成员C
仍为零初始化其他成员,如果我明确构造对象一样C c{};
?
因为如果我有一个构造函数与C
(如 …
我知道指定成员函数“const”允许我们从 const 对象调用它,但为什么我们必须在成员函数旁边显式写“const”?为什么编译器不能弄清楚
int getFoo() {
return m_foo;
}
Run Code Online (Sandbox Code Playgroud)
确实是“const”吗?