小编use*_*453的帖子

何时应该在函数返回值上使用std :: move?

在这种情况下

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)

我认为需要采取行动吗?

c++ move-semantics c++11

109
推荐指数
4
解决办法
5万
查看次数

我可以将unsigned char转换为char,反之亦然吗?

我想使用一个期望这样的数据的函数:

void process(char *data_in, int data_len);
Run Code Online (Sandbox Code Playgroud)

所以它只是处理一些字节.

但是当谈到原始字节时,我更习惯使用"unsigned char"(它在某种程度上"感觉"更适合处理正0到255的值),所以我的问题是:

我可以随时安全地传入unsigned char *此功能吗?

换一种说法:

  • 是否保证我可以随意地在char和unsigned char之间转换(强制转换),而不会丢失任何信息?
  • 我可以安全地转换(强制转换)指向char和unsigned char的指针,而不会丢失任何信息吗?

额外奖励:C和C++的答案是否相同?

c c++

56
推荐指数
3
解决办法
5万
查看次数

将pp(或输出到控制台的任何内容)的结果放入字符串中

我们知道

require 'pp'
a=["value1", "value2", "value3"]
pp a
Run Code Online (Sandbox Code Playgroud)

pretty将数组打印为控制台的输出.我如何将这个漂亮的输出变成一个字符串(一个包含让事情变得漂亮的新行的字符串等)?

...目的是从方法中返回那个漂亮的字符串.

ruby

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

将对象移动到地图中

这个问题是巨大的物体将被复制到地图中

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)

c++ c++11

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

我的书对lambda返回类型的讨论是错误的吗?

我的书说:

具有函数体的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

c++ lambda llvm clang c++11

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

为文件/目录提供与另一个相同的修改日期

如何在基于Unix的系统中将修改日期和时间从一个文件/目录"复制"到另一个文件/目录?

unix bash

12
推荐指数
2
解决办法
4413
查看次数

关于静态数据成员的类内初始化的困惑

我正在阅读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变量添加任何定义.但我仍然没有错,因为他们说我应该得到.为什么不?

c++

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

使用已在其他位置std :: move'ed的变量时出错或至少是警告

这个:

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)

c++ move-semantics c++11

8
推荐指数
2
解决办法
390
查看次数

C++编码器通常是显式移动还是只依靠编译器来做?

我们在某些功能中有这个:

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++程序员是否真的会采取行动来保证此举?

c++ move-semantics c++11

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

当有const成员时,为什么= default = operator = compile?

class Foo {
public:
  Foo& operator=(const Foo&) = default;
private:
  const int i = 0;
};
Run Code Online (Sandbox Code Playgroud)

为什么=default允许那里?它编译没有错误.我认为=default应该失败,因为它不可能分配给const变量?

究竟发生了什么?

c++ c++11

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

标签 统计

c++ ×8

c++11 ×6

move-semantics ×3

bash ×1

c ×1

clang ×1

lambda ×1

llvm ×1

ruby ×1

unix ×1