对象销毁和委托构造函数

cur*_*y12 4 c++ constructor c++11

根据有关委托构造函数的问题,当第一个构造函数完成时,将调用析构函数。
\n这与下面的代码是一致的:

\n
struct test {\n    test() { std::cout << "default constr\\n"; }\n    test(int) : test() { std::cout << "argument constr\\n"; throw int{}; }\n    ~test() { std::cout << "destr\\n"; }\n};\n\nint main()\n{\n    try {\n        test t{3};\n    } catch(...)\n    {\n        std::cout << "caught\\n";\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
default constr\nargument constr\ndestr\ncaught\n
Run Code Online (Sandbox Code Playgroud)\n

但是,Stroustrup 在他的书中(第 4 版,第 503 页)说了以下内容:

\n
\n

在对象的构造函数完成之前,对象不会被视为已构造 (...)。使用委托构造函数时,在委托构造函数完成\xe2\x80\x93 之前,对象不会被视为已构造,仅完成委托构造函数是不够的。除非其原始构造函数完成,否则不会为对象调用析构函数。\n

\n
\n

是我误读了还是他有别的意思?

\n

eer*_*ika 6

我是不是误读了这个

我不这么认为。

或者他还有别的意思吗?

我不这么认为。

据我所知,这似乎是书中的一个错误。本书的描述可能基于最初的委托构造函数提案。该行为在提案的后续修订中发生了变化。