相关疑难解决方法(0)

什么是移动语义?

我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?

c++ c++-faq move-semantics c++11

1614
推荐指数
11
解决办法
39万
查看次数

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

T &&(双&符号)在C++ 11中意味着什么?

我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.

首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.

究竟是什么意思?

乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.

c++ c++-faq rvalue-reference perfect-forwarding c++11

747
推荐指数
4
解决办法
18万
查看次数

迭代器使用end()持续std :: vector的元素 -

我有一个std::vector,我想要iterator向量中的最后一个元素; 我将存储此迭代器供以后使用.

注意:我想要一个迭代器引用它,而不是std::vector::back.因为我希望能够从std::vector::begin后面开始计算这个对象的索引.

以下是我将迭代器放到最后一个元素的逻辑:

std::vector<int> container;
std::vector<int>::iterator it = container.end()--;
Run Code Online (Sandbox Code Playgroud)

由于std::vector::end具有O(1)时间复杂度,有没有更好的方法来做到这一点?

c++ stl vector c++11

11
推荐指数
3
解决办法
2万
查看次数

使用std :: swap而不是使用'='运算符赋值

我正在从一个与我正在研究的宠物项目相关的库中查看一些C++源代码,并遇到了一些我不理解的东西.在我期望指针取消引用后跟赋值的地方,库作者std::swap()在函数末尾附近使用来写结果:

std::swap(*out, result);

我希望看到这样的事情:

*out = result;

请注意,resulttypedefsize_t,并out是一个指向同一类型.

谈到"系统编程",我的背景是C和C#,但在C++中并不多.这种"任务"有什么特别的原因吗?

c++ swap variable-assignment

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

带或不带 const/&amp; 符号的 C++ 方括号重载

我正在编写 C++ 代码,并遇到了一种情况,我希望为我的类重载方括号运算符。从各种来源,我发现您通常使用两种方法来执行此操作,一种使用const关键字,另一种不使用关键字,但在方法名称之前const使用与号 ( )。&下面给出一个例子。

int MyClass::operator[](unsigned int i) const {
    return this->values[i];
}

int & MyClass::operator[](unsigned int i) {
    return this->values[i];
}
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  1. 为什么我有两种方法,一种带关键字const,一种不带关键字?
  2. 我的第二个方法中的&符号(&)有什么作用?
  3. 当我的方法都不是设置器时,为什么可以使用方括号在给定索引处设置值,并且当我设置值时会调用这两个方法中的哪一个?

c++ operator-overloading square-bracket getter-setter

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

为什么右值按值传递给函数时不被复制?

我有以下代码:

struct Foo {
    Foo() = default;
    Foo(const Foo&) { std::cout << "Copy" << std::endl; }
    Foo(Foo&&) noexcept { std::cout << "Move" << std::endl; }
};

struct Bar {
    Bar(Foo foo) : foo(std::move(foo)) {}
    Foo foo;
};

int main() {
    Foo foo;
    std::cout << "Pass l-value:" << std::endl;
    Bar barL(foo);
    std::cout << "Pass r-value:" << std::endl;
    Bar barR({});
}
Run Code Online (Sandbox Code Playgroud)

它打印以下内容:

Pass l-value:
Copy
Move
Pass r-value:
Move
Run Code Online (Sandbox Code Playgroud)

编译器如何理解它不能复制右值?

c++

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