c++ - 调用带有大括号括起来的初始化列表的类的构造函数

标签 c++

我需要如何定义一个构造函数,以便我可以构造一个像 A({a,b,c}) 这样的类 A。 这是为了避免使用看起来很危险的可变参数构造函数。

代码:

#include <vector>

class A{
public:
A(const unsigned int a, const unsigned int b, const unsigned int c) /*: A({a,b,c})*/ {} 
A(const std::vector<unsigned int> v) {}
};


int main(){
A(1,2,3); //works
A({1,2,3}); // doesnt compile

return 0;
}

我的目标是构建一个具有任意多个隐藏层的网络。该 vector 应该包含相应层所包含的节点数量。

编辑:

/home/simbla/qt_projects/minimalWorkingExample/main.cpp:158: error: call of overloaded 'A(<brace-enclosed initializer list>)' is ambiguous
 A({1,2,3});
          ^

解决方案:

使用 std::initializer_list 而不是 std::vector

最佳答案

您的问题中的构造函数实际上比您表现的要多。这是另外两个,由编译器提供:

A(A const&) = default;
A(A &&) = default;

现在有趣的是,当您编写另一个初始化程序 A{1, 2, 3} 时会发生什么。这调用了您的第一个用户定义的c'tor。那里没什么新奇的。但是当您编写 A({1, 2, 3}) 时,重载解析有两个选项。构造一个临时 A{1, 2, 3} 并复制它。或者为其他用户提供的 c'tor 构建一个 vector 。

在这两种情况下,它都是用户定义的转换序列。两者都不比另一个更好,因此由于模糊性,您会得到一个很好的闪烁错误。

解决方案?使用大括号初始化 A{{1,2,3}}; 或提供initializer_list 构造函数,以更好地匹配初始值设定项列表参数。


关于c++ - 调用带有大括号括起来的初始化列表的类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49261221/

相关文章:

c++ - Select() 不适合我

c++ - C 和 C++ 类型转换的区别?

c++ - boost::format hex 中的奇怪行为

c++ - 有什么办法可以缩短这个时间吗?

c++ - 为什么 C++ 库经常定义自己的原始类型?

c++ - 当我在 C++ 中将临时 int 分配给 const 引用时会发生什么?

c++ - UI 菜单开发资源

c++ - 为什么只能保证std::atomic_flag是无锁的?

c++ - add_lvalue_reference 有什么作用?

c++ - 开启g++优化导致segmentation fault