C++ 编译器能否用直接初始化代替复制初始化?

C++ 编译器能否用直接初始化代替复制初始化?,c++,copy-constructor,C++,Copy Constructor,C++初级读本第5版在第499页声明允许编译器替换 string null_book = "9-999-9999-9"; // copy initialization 为了 另一方面,研究表明,一般来说,这两种形式可以产生不同的结果 < >我如何将C++语句与引用的帖子(> p >)进行协调?是的,这是许多情况下的一种,受复制删除规则[Copy.Actudi]的影响,编译器可以产生临时对象,但不需要这样做。 形式上,当u是类型u的值且T可由u构造时,则初始化T=u;意味着t是由一个临时变量构成

C++初级读本第5版在第499页声明允许编译器替换

string null_book = "9-999-9999-9"; // copy initialization
为了

另一方面,研究表明,一般来说,这两种形式可以产生不同的结果


< >我如何将C++语句与引用的帖子(

> p >)进行协调?是的,这是许多情况下的一种,受复制删除规则[Copy.Actudi]的影响,编译器可以产生临时对象,但不需要这样做。
形式上,当u是类型u的值且T可由u构造时,则初始化T=u;意味着t是由一个临时变量构成的,这个临时变量是由u构成的,就好像您编写了t=Tu;。然而,该副本可能且通常被省略,其效果为T tu;,只有复制初始化要求构造函数是非显式的。

是的,这是许多情况中的一种,由复制省略[class.copy]规则控制,在这种情况下,编译器可能会生成一个临时对象,但不需要这样做


形式上,当u是类型u的值且T可由u构造时,则初始化T=u;意味着t是由一个临时变量构成的,这个临时变量是由u构成的,就好像您编写了t=Tu;。然而,该副本可能且通常被省略,其效果为T tu;,只有那个拷贝初始化要求构造函数是非显式的。

< p>试图用普通C++代码来说明拷贝删除。这并不意味着允许编译器将复制初始化更改为直接初始化,即使在您显示的初始化情况下,使用复制省略的复制初始化与直接初始化具有相同的效果

允许的可观察行为的唯一变化是省略对复制/移动构造函数和析构函数的调用。调用的另一个构造函数从未更改。因此:

struct Meow {
    explicit Meow(int); // #1
    Meow(double);       // #2
    Meow(const Meow&);  // #3
};

Meow m = 1;     // OK, always call #2, may or may not call #3
Meow n(1);      // OK, call #1, never call #3
Meow p = {1};   // Error: copy-list-initialization selected explicit constructor
Meow q{1};      // OK, call #1, never call #3
Meow r = {1.0}; // OK, call #2, never call #3 

本书试图用普通C++代码说明拷贝删除。这并不意味着允许编译器将复制初始化更改为直接初始化,即使在您显示的初始化情况下,使用复制省略的复制初始化与直接初始化具有相同的效果

允许的可观察行为的唯一变化是省略对复制/移动构造函数和析构函数的调用。调用的另一个构造函数从未更改。因此:

struct Meow {
    explicit Meow(int); // #1
    Meow(double);       // #2
    Meow(const Meow&);  // #3
};

Meow m = 1;     // OK, always call #2, may or may not call #3
Meow n(1);      // OK, call #1, never call #3
Meow p = {1};   // Error: copy-list-initialization selected explicit constructor
Meow q{1};      // OK, call #1, never call #3
Meow r = {1.0}; // OK, call #2, never call #3 

在本例中,您使用的是std::string,因此我认为没有什么区别。@coincoin我意识到了这一点,并添加了一些词语,以明确我在最一般的上下文中引用编译器的这种行为。我认为C++入门是指一般的上下文,虽然它们使用了字符串的这个例子。在这种情况下,你使用的是STD::string,所以我认为没有什么区别。虽然C++使用了字符串的例子,但是我引用的帖子是什么意思呢?这里满足了这个前提条件,并且通过使用直接初始化获得了不同的结果…@MeirGoldenberg:复制省略的规则明确地允许省略,即使复制构造函数有副作用。因此,根据使用了多少临时变量,您确实可以获得不同的输出。您的意思是引用文章中的代码是未定义行为的示例吗?@MeirGoldenberg:不,我根本不是这个意思。是什么给你这样的印象?因为编译器被允许但不需要通过直接初始化来改变代码中的复制初始化。根据编译器的选择,会产生不同的结果。但是我引用的帖子呢?这里满足了这个前提条件,并且通过使用直接初始化获得了不同的结果…@MeirGoldenberg:复制省略的规则明确地允许省略,即使复制构造函数有副作用。因此,根据使用了多少临时变量,您确实可以获得不同的输出。您的意思是引用文章中的代码是未定义行为的示例吗?@MeirGoldenberg:不,我根本不是这个意思。是什么给你这样的印象?因为编译器被允许但不需要通过直接初始化来改变代码中的复制初始化。根据编译器的选择,将产生不同的结果。