찾다

 >  Q&A  >  본문

C++拷贝构造函数:C++ Primer

itemStr it_str = "123456";

这样的代码应该是拷贝初始化?如果是拷贝初始化,那么在C++ Primer 中文版第五版中441页提到

拷贝初始化是依靠拷贝构造函数或移动构造函数来往成的

但是实际调用的却是itemStr(const char *s)

这是为什么,是书的错误还是编译器的优化操作

itemStr类,如上所写会输出This is normal constructor2.

class itemStr
{
public:
    itemStr() :
        str()
    {
        std::cout << "This is default constructor." << std::endl;
    }

    itemStr(std::string s) :
        str(s)
    {
        std::cout << "This is normal constructor1." << std::endl;
    }

    itemStr(const char *s) :
        str(s)
    {
        std::cout << "This is normal constructor2." << std::endl;
    }
    itemStr(const itemStr &it) :
        str(it.str)
    {
        std::cout << "This is copy constructor." << std::endl;
    }

    itemStr& operator=(const itemStr &it)
    {
        str = it.str;
        std::cout << "This is copy-assignment operator constructor." << std::endl;
        return *this;
    }

private:
     std::string str;
};
PHP中文网PHP中文网2813일 전605

모든 응답(1)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 15:40:26

    이 초기화 구문은 복사 초기화입니다. 컴파일러가 복사 제거 최적화를 수행하므로 복사/이동 생성자는 런타임에 호출되지 않습니다. 복사/이동 생성자에 눈에 띄는 부작용이 있는 경우에도 컴파일러는 여전히 이 최적화를 수행할 수 있습니다. 결과적으로 예상되는 출력을 관찰할 수 없습니다.

    즉, itemStr it_str = "123456";은 복사 초기화이므로 사용 가능한 복사/이동 생성자가 필요합니다. 다음 코드는 gcc/clang에서 컴파일할 때 컴파일 오류를 보고합니다.

    으아악
    으아악

    회신하다
    0
  • 취소회신하다