在这种情况下
struct Foo {};
Foo meh() {
return std::move(Foo());
}
Run Code Online (Sandbox Code Playgroud)
我很确定移动是不必要的,因为新创建的Foo将是一个xvalue.
但在这种情况下呢?
struct Foo {};
Foo meh() {
Foo foo;
//do something, but knowing that foo can safely be disposed of
//but does the compiler necessarily know it?
//we may have references/pointers to foo. how could the compiler know?
return std::move(foo); //so here the move is needed, right?
}
Run Code Online (Sandbox Code Playgroud)
我认为需要采取行动吗?
我想使用一个期望这样的数据的函数:
void process(char *data_in, int data_len);
Run Code Online (Sandbox Code Playgroud)
所以它只是处理一些字节.
但是当谈到原始字节时,我更习惯使用"unsigned char"(它在某种程度上"感觉"更适合处理正0到255的值),所以我的问题是:
我可以随时安全地传入unsigned char *此功能吗?
换一种说法:
额外奖励:C和C++的答案是否相同?
我们知道
require 'pp'
a=["value1", "value2", "value3"]
pp a
Run Code Online (Sandbox Code Playgroud)
pretty将数组打印为控制台的输出.我如何将这个漂亮的输出变成一个字符串(一个包含让事情变得漂亮的新行的字符串等)?
...目的是从方法中返回那个漂亮的字符串.
这个问题是巨大的物体将被复制到地图中
Huge huge1(some,args);
Huge huge2(some,args);
std::map<int,Huge> map1;
std::map<Huge,int> map2;
map1.insert({0,huge1});
map2.insert({huge2,0});
Run Code Online (Sandbox Code Playgroud)
我怎么能保证搬家?这会有用还是有更多呢?
map1.insert({0,std::move(huge1)});
map2.insert({std::move(huge2),0});
Run Code Online (Sandbox Code Playgroud) 我的书说:
具有函数体的Lambda包含除了单个return语句之外的任何未指定返回类型的返回void.
但是这个:
auto f = []{
int i=0; i++;
return std::string("foo");
};
std::cout << f() << std::endl;
Run Code Online (Sandbox Code Playgroud)
实际上编译并打印出"foo",但是lambda expr不仅仅包含一个return语句,因此它应该返回void,因为它不会手动指定" - > std :: string"作为返回类型.
这里发生了什么?
我在基于Clang 3.2的最新Xcode 4.6中使用Apple的编译器似乎:
clang --version
Apple LLVM版本4.2(clang-425.0.24)(基于LLVM 3.2svn)目标:x86_64-apple-darwin12.2.0线程模型:posix
我正在阅读lippman的c ++入门,其中p.他们给出了这个:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
}
Run Code Online (Sandbox Code Playgroud)
如果成员仅在编译器可以替换成员的值的上下文中使用,则不需要单独定义初始化的const或constexpr静态.但是,如果我们在无法替换值的上下文中使用该成员,则必须有该成员的定义.
也:
例如,如果我们将Account :: period传递给一个带有const int&的函数,则必须定义period.
所以我尝试添加这样一个功能:
class Account {
private:
static constexpr int period = 30;
double daily_tbl[period];
void foo(const int &i) { ; }
void bar() { foo(period); } //no error?
};
Run Code Online (Sandbox Code Playgroud)
在那里我添加了一个带有const int&的函数.我也没有为period变量添加任何定义.但我仍然没有错,因为他们说我应该得到.为什么不?
这个:
void foo(int &&r) {
std::cout << r << std::endl;
}
int main() {
int i = 2;
foo(std::move(i));
i = 3; //no warning. any way to get some warnings here?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉编译器给我一个错误(或警告)如果我不小心使用了可变我提出以后呢?我觉得这很方便.很多时候我发现自己在其他地方移动变量,但后来我手动必须非常小心,以后我不再使用它们.现在这还没有引起任何问题,但是谁知道这一点......更好的是安全!
也许有一些预处理器技巧(或相当广泛可用的编译器扩展)存在来做这些事情?
更现实的例子:
struct HugeStorage {
std::vector<double> m_vec;
HugeStorage(std::vector<double> vec) : m_vec(std::move(vec)) { }
};
struct SmallStorage {
std::vector<double> m_vec;
SmallStorage(std::vector<double> vec) : m_vec(std::move(vec)) { }
};
std::vector<double> vec_from_data_source() {
return std::vector<double>(); //only example!!
}
int main() {
std::vector<double> vec = vec_from_data_source();
if (vec.size() > 10000) …Run Code Online (Sandbox Code Playgroud) 我们在某些功能中有这个:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
Run Code Online (Sandbox Code Playgroud)
这些天大多数C++程序员是否真的会采取行动来保证此举?
class Foo {
public:
Foo& operator=(const Foo&) = default;
private:
const int i = 0;
};
Run Code Online (Sandbox Code Playgroud)
为什么=default允许那里?它编译没有错误.我认为=default应该失败,因为它不可能分配给const变量?
究竟发生了什么?