相关疑难解决方法(0)

initializer_list和移动语义

我允许将元素移出std::initializer_list<T>

#include <initializer_list>
#include <utility>

template<typename T>
void foo(std::initializer_list<T> list)
{
    for (auto it = list.begin(); it != list.end(); ++it)
    {
        bar(std::move(*it));   // kosher?
    }
}
Run Code Online (Sandbox Code Playgroud)

由于std::intializer_list<T>需要特殊的编译器注意并且没有像C++标准库的普通容器那样的值语义,所以我宁愿安全而不是抱歉并且问.

c++ templates initializer-list move-semantics c++11

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

有没有办法在 C++ 编译器中禁用复制省略

在 c++98 中,以下程序应调用复制构造函数。

#include <iostream>

using namespace std;
class A
{
  public:
    A() { cout << "default" ; }

    A(int i) { cout << "int" ; }


    A(const A& a) { cout << "copy"; }
};

int main ()
{
   A a1;
   A a2(0);
   A a3 = 0;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您在上述情况下显式声明复制构造函数(编译器出错),这很明显。但是当它未声明为显式时,我看不到复制构造函数的输出。我想这是因为复制省略。有什么方法可以禁用复制省略或标准是否强制要求?

c++ initialization copy-constructor

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