相关疑难解决方法(0)

保证副本省略如何运作?

在2016年奥卢ISO C++标准会议上,标准委员会将一项名为" 保证副本省略"的提案通过简化的价值类别投票进入C++ 17.

保证副本省略如何运作?是否涵盖了某些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

c++ copy-elision c++17

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

本地函数声明有用吗?

像我这样的大多数C++程序员在某些方面犯了以下错误:

class C { /*...*/ };

int main() {
  C c();     // declares a function c taking no arguments returning a C,
             // not, as intended by most, an object c of type C initialized
             // using the default constructor.
  c.foo();   // compiler complains here.

  //...
}
Run Code Online (Sandbox Code Playgroud)

现在虽然错误很明显,一旦你知道它我想知道这种本地函数声明是否有任何明智的用途,除了你可以这样做 - 特别是因为没有办法在同一个函数中定义这样的本地函数块; 你必须在其他地方定义它.

我认为Java风格的本地类是一个非常好的功能,我倾向于经常使用,特别是匿名排序.甚至本地C++类(可以具有内联定义的成员函数)也有一些用处.但是这个没有定义的本地函数声明对我来说似乎很尴尬.它只是一个C-legacy还是有一些我不知道的更深层次的用例?

编辑对于非信徒:C c()不是一个函数指针声明.

这个计划

int main()
{
  void g();
  cout << "Hello ";
  g();
  return 0;
}

void g()
{
  cout << …
Run Code Online (Sandbox Code Playgroud)

c++ function local definition

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

为什么在按值返回列表初始化对象时不调用copy-constructor?

据我所知,当从函数返回-value对象时,会调用它们的copy-constructors.如果类具有已删除的复制构造函数,则按值返回将失败.

struct X {
    X(const X &) = delete;
};

X f() {
   return X{};
}
Run Code Online (Sandbox Code Playgroud)

error: call to deleted constructor of 'X'

C++ 11为我们提供了扩展初始化器.我在SO帖子的某个地方读到了这个

X f() {
    return {};
}
Run Code Online (Sandbox Code Playgroud)

是相同的

X f() {
    return X{};
}
Run Code Online (Sandbox Code Playgroud)

那么为什么下面的代码没有给我一个错误?它通过了,我甚至可以在main中调用该函数:

struct D {
   D(const D &) = delete;
};

D f() { return {}; }

int main()
{
   f();
}
Run Code Online (Sandbox Code Playgroud)

这是一个演示.没有报告错误.我发现这很奇怪,因为我认为应该调用copy-constructor.任何人都可以解释为什么没有给出错误?

c++ c++11

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

标签 统计

c++ ×3

c++11 ×1

c++17 ×1

copy-elision ×1

definition ×1

function ×1

local ×1