C++ 在C++;模板复制分配运算符与初始值设定项\u列表不兼容?
假设我有这样的代码:C++ 在C++;模板复制分配运算符与初始值设定项\u列表不兼容?,c++,templates,c++11,initializer-list,C++,Templates,C++11,Initializer List,假设我有这样的代码: #include <initializer_list> class my_class { public: my_class() {} void operator = (const std::initializer_list<int>&) {} // OK template<typename ValueType> void operator = (const ValueType&) {} // F
#include <initializer_list>
class my_class
{
public:
my_class() {}
void operator = (const std::initializer_list<int>&) {} // OK
template<typename ValueType> void operator = (const ValueType&) {} // Failed
};
int main(int argc, char* argv[])
{
my_class instance;
instance = {1, 2};
return 0;
}
为什么模板版本与初始值设定项列表不兼容?因为初始值设定项列表是非推断上下文。从[临时扣除类型]: 非推断上下文为:
-[…]
-关联参数为初始值设定项列表(8.5.4)的函数参数,但 没有指定从初始值设定项列表中扣除的类型(14.8.2.1)。[示例: 因此,在您的具体情况下,您可以执行以下操作:
template <typename T>
void operator=(std::initializer_list<T> ) { }
模板
void运算符=(std::初始值设定项\u列表){}
或:
模板
void运算符=(T常量(&)[N]){
尽管后者显然不能在clang上编译,但编译错误。将模板版本更改为
template <typename ValueType>
void operator =(const std::initializer_list<ValueType> &) {}
模板
void运算符=(常量std::初始值设定项\u列表&){
顺便说一句,这可能不是您想要指定运算符=
的方式。定义void运算符=(const initializer\u list&somevariable),这样它将遵循int的每个值的模板版本。后者通过const引用传递类型为T的数组?
template<class T> void f(std::initializer_list<T>);
f({1,2,3}); // T deduced to int
template<class T, int N> void h(T const(&)[N]);
h({1,2,3}); // T deduced to int, N deduced to 3
template<class T> void j(T const(&)[3]);
j({42}); // T deduced to int, array bound not considered
template <typename T>
void operator=(std::initializer_list<T> ) { }
template <typename T, size_t N>
void operator=(T const(&)[N]) { }
template <typename ValueType>
void operator =(const std::initializer_list<ValueType> &) {}