小编Joj*_*ino的帖子

如何强制,值成为左值引用?

我希望我的函数采用左值引用,而绝对不是右值临时或其他任何

这是我的功能:

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采用左值引用?

c++ templates lvalue function-templates c++11

3
推荐指数
1
解决办法
123
查看次数

构造字符串向量时是否有副本?

以下代码将“我的字符串”分割为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))所以我们避免了复制吗?

c++ move

2
推荐指数
1
解决办法
70
查看次数

没有构造函数的 C++ 零初始化

我不明白关于其成员具有默认值的结构的零初始化会发生什么。

如果我有这些结构:

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(如 …

c++ constructor struct initialization

1
推荐指数
1
解决办法
111
查看次数

C++为什么声明成员函数为const

我知道指定成员函数“const”允许我们从 const 对象调用它,但为什么我们必须在成员函数旁边显式写“const”?为什么编译器不能弄清楚

int getFoo() {
  return m_foo;
}
Run Code Online (Sandbox Code Playgroud)

确实是“const”吗?

c++ member-functions

-1
推荐指数
1
解决办法
92
查看次数