C++中的委托构造函数可以在正文中调用还是只在初始化列表中调用?

NoS*_*tAl 2 c++ c++11

正如标题所说,我很好奇是否可以在正文中调用委托构造函数.

如果你对动机充满好奇:我有一些条件,只有我发现的解决方法需要在虚拟成员上写占用空间.

#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)

Que*_*tin 6

您的代码没有按照您的想法执行.通过添加详细的析构函数:

~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)

......并且不可能有条件地委托.您可以使用执行检查的静态函数,并返回一个适当构造的对象(也称为"命名构造函数模式").