gpt4 book ai didi

c++ - 复制初始化期间不会发生 std::string 的隐式构造

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:13 24 4
gpt4 key购买 nike

我正尝试在 main() 函数中复制初始化我的 CObj 类:

#include <string>
#include <iostream>

class CObj
{
public:
CObj(std::string const& str) : m_str(str) { std::cout << "constructor" << std::endl; }

~CObj() { std::cout << "destructor" << std::endl; }

private:
std::string m_str;
};

int main()
{
CObj obj = "hello";

std::cout << "done" << std::endl;
}

但是,即使 std::string 是从 char const* 隐式构造的,CObj obj = "hello" 行也无法编译>。根据我在这里的理解,这应该有效。有什么理由不这样做吗?如果我这样做,它会起作用:

CObj obj = std::string("hello");

最佳答案

文字 "Hello" 的类型为 const char[6] :为了调用您的构造函数,需要进行两次转换:一次转换为 std::string 和第二个 CObj

但是 C++ 在进行隐式转换时只允许一个用户定义的转换:

C++ 标准部分 § 12.3/4 [class.conv]

Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions

[...]

At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.


这就是它起作用的原因:

CObj obj = std::string("hello");

或者这个:

CObj obj("hello");

或者你可以提供一个接受 const char* 的构造函数:

CObj(const char* cstr) : m_str(cstr) { ... }

我总是建议让这样的构造函数显式以避免不需要的隐式转换,除非它真的给类的用户带来了一些东西。

关于c++ - 复制初始化期间不会发生 std::string 的隐式构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26341835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com