正如标题所说,我很好奇是否可以在正文中调用委托构造函数.
如果你对动机充满好奇:我有一些条件,只有我发现的解决方法需要在虚拟成员上写占用空间.
#include <iostream>
using namespace std;
struct Delegating {
Delegating (const string& str) {
cout <<"const string& \n";
}
Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0)) {
if (str.size()>4) {
cout <<"string&& \n";
}
}
bool dummy_;
};
int main() {
// your code goes here
Delegating("abc");
Delegating("abcde");
Delegating("abcde");
Delegating("abcde");
Delegating("abc");
cout << "\n--------------------\n";
Delegating(string("abc"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abcde"));
Delegating(string("abc"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您的代码没有按照您的想法执行.通过添加详细的析构函数:
~Delegating() {
std::cout << "~\n";
}
Run Code Online (Sandbox Code Playgroud)
...输出变为:
const string&
~
~
string&&
~
string&&
~
string&&
~
const string&
~
~
--------------------
(and so on)
Run Code Online (Sandbox Code Playgroud)
请注意,有七个析构函数调用,而您只实例化了五个对象.那是因为在以下行中:
Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0)) {
Run Code Online (Sandbox Code Playgroud)
... Delegating(str)不是委托构造函数调用,而是一个独立的临时对象,它在初始化期间创建和销毁dummy_.
委托构造函数的唯一语法是:
Foo(/* params */) : Foo(/* other params */), /* members-init */ {}
// First one ! ^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
......并且不可能有条件地委托.您可以使用执行检查的静态函数,并返回一个适当构造的对象(也称为"命名构造函数模式").
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |