标签:c c11 constructor type-conversion
在C 11中,没有显式关键字的构造函数可用于将隐式参数列表转换为其类.例如:
class Date{
private:
int d, m, y;
public:
Date(int _d, int _m=0, int _y=0) : m(_m), d(_d), y(_y) {}
friend bool operator==(const Date &x, const Date &y) {return x.d==y.d;}
};
int main()
{
Date x = {1,2,3}; // no error; using converting constructor
x == 1; // no error; converting constructor turns int into Date object
x == {1,2,3}; // error
}
对于x == {1,2,3},我收到以下错误:
explicit.cc:16:10: error: expected primary-expression before ‘{’ token
x=={1,2,3};
^
我想知道为什么转换构造函数不会将列表{1,2,3}转换为Date对象?特别是因为x == 1不会导致错误,为什么x == {1,2,3}?
解决方法:
你可能会特别惊讶:
x = {1, 2, 3}; // ok
x == {1, 2, 3}; // error
operator==(x, {1, 2, 3}); // ok
这是因为只有特定的地方可以使用braced-init-list(基本上是逗号分隔的{} s之间的东西列表).它可以在=的右侧,因为规则说它可以.它可以用作函数调用表达式中的参数,因为规则说它可以.但它不能在比较运算符的任何一方使用,因为规则不允许它.
我不知道这背后是否有一个根本原因,可能不是强烈需要它.
标签:c,c11,constructor,type-conversion 来源: https://codeday.me/bug/20190910/1801602.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。