【发布时间】:2015-11-04 00:23:07
【问题描述】:
我写了一些代码S s; ... s = {};,希望它最终与S s = {}; 相同。然而它没有。下面的例子重现了这个问题:
#include <iostream>
struct S
{
S(): a(5) { }
S(int t): a(t) {}
S &operator=(int t) { a = t; return *this; }
S &operator=(S const &t) = default;
int a;
};
int main()
{
S s = {};
S t;
t = {};
std::cout << s.a << '\n';
std::cout << t.a << '\n';
}
输出是:
5
0
我的问题是:
- 为什么这里选择
operator=(int),而不是“模糊”或其他? - 是否有一个整洁的解决方法,无需更改
S?
我的意图是 s = S{}; 。如果有效,写s = {}; 会很方便。我目前使用的是s = decltype(s){};,但我希望避免重复类型或变量名。
【问题讨论】:
-
{}到int是身份转换([over.ics.list]/9)。{}到S是用户定义的转换 ([over.ics.list]/6)。我发誓我昨天看到了一个非常相似的问题...... -
@T.C.如果是这样,我想我可以通过昨天阅读更多问题来节省一些开发时间!
-
我的代码中的许多地方似乎都犯了同样的错误......例如我通常使用
void clear() { *this = {}; }来将对象恢复到其值初始化状态 -
顺便说一句,
optional做了一些有趣的事情来使= {}在所有情况下都能正常工作。
标签: c++ c++11 overload-resolution