正如标题所说,我很好奇是否可以在正文中调用委托构造函数。
如果你对动机感到好奇: 我有一些条件,只有我发现需要使用uselss写入占用空间的虚拟成员。
#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;
}
答案 0 :(得分:6)
您的代码没有按照您的想法执行。通过添加详细的析构函数:
#!/bin/sh
echo window
read -p
...输出变为:
~Delegating() {
std::cout << "~\n";
}
请注意,有七个析构函数调用,而您只实例化了五个对象。这是因为在以下行中:
const string&
~
~
string&&
~
string&&
~
string&&
~
const string&
~
~
--------------------
(and so on)
... Delegating(string&& str): dummy_(str.size()>4 ? 0 : (Delegating(str),0)) {
不是委托构造函数调用,而是一个独立的临时对象,在Delegating(str)
初始化期间创建和销毁。
委托构造函数的唯一语法是:
dummy_
...并且无法有条件地委托。你可以使用一个执行检查的静态函数,并返回一个适当构造的对象(a.k.a&#34; Named Constructor Pattern&#34;)。
答案 1 :(得分:1)
其他答案已经指出,如果你从构造函数中调用构造函数,那么你正在创建一个临时的。我想指出,您的测试用例永远不会直接调用构造函数Delegating (const string& str)
。在所有这些情况下,Delegating(string && str)
更适合。
尝试使用以下使用命名构造函数的代码。
#include <iostream>
using namespace std;
struct Delegating
{
Delegating()
{
cout << "default \n";
};
Delegating( const string & str )
{
cout << "const string & \n";
}
Delegating( const string && str )
{
cout << "string && \n";
}
static Delegating constr( const string & a_Str )
{
cout << a_Str.data() << '\t';
return Delegating( a_Str );
}
static Delegating constr( string && x_Str )
{
cout << x_Str.data() << '\t';
if ( x_Str.size() > 4 )
return Delegating();
else
return Delegating( x_Str );
}
~Delegating()
{
cout << "~\n";
}
};
int main()
{
{
Delegating::constr( "abc" );
Delegating::constr( "abcde" );
cout << "\n--------------------\n";
Delegating::constr( string( "abc" ) );
Delegating::constr( string( "abcde" ) );
cout << "\n--------------------\n";
string d_Named( "abc" );
Delegating::constr( d_Named );
d_Named = "abcde";
Delegating::constr( d_Named );
}
return 0;
}