我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.
首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.
究竟是什么意思?
乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.
我有一个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++ 代码,并遇到了一种情况,我希望为我的类重载方括号运算符。从各种来源,我发现您通常使用两种方法来执行此操作,一种使用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)
我的问题如下:
const,一种不带关键字?&)有什么作用?我有以下代码:
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)
编译器如何理解它不能复制右值?