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