gpt4 book ai didi

c++ - 是否可以编写便于复制初始化的显式构造函数?

转载 作者:行者123 更新时间:2023-11-30 01:03:17 26 4
gpt4 key购买 nike

我实际上正在编写一个字符串的实现,并且在尝试从单个字符构造字符串时遇到了一个令人困惑的场景。

我的字符串.h

  class string final {
private:
static constexpr std::size_t default_capacity_ = 0;
std::size_t current_capacity_;
std::size_t sz_;
std::unique_ptr<char[]> ptr_;
public:
explicit string(char); // [1]
string();
string(const string&);
string(string&&) noexcept;
string(const char*); // Undefined behavior if the input parameter is nullptr.
~string() noexcept;
};

我的字符串.cpp

  string::string(char ch) {
sz_ = 1;
current_capacity_ = get_appropriate_capacity(sz_);
ptr_ = std::make_unique<char[]>(current_capacity_ + 1);
ptr_.get()[0] = ch;
ptr_.get()[1] = '\0';
}

string::string(const char* c_string) { // [2]
sz_ = std::strlen(c_string);
current_capacity_ = get_appropriate_capacity(sz_);
ptr_ = std::make_unique<char[]>(current_capacity_ + 1);
std::memcpy(ptr_.get(), c_string, sz_ + 1);
}

测试.cpp

#include "my_string.h"

using namespace kapil;

int main() {
string z8 = 'c'; // [3]
return 0;
}

在这个例子中,[3] 不编译,因为字符串的构造函数 string(char ch) 是显式的。 [3] 给出以下错误:

error: invalid conversion from ‘char’ to ‘const char*’ [-fpermissive]
string z8 = 'c';
^~~
In file included from test_string.cpp:1:0:
my_string.h:22:7: note: initializing argument 1 of ‘kapil::string::string(const char*)’
string(const char*); // Undefined behavior if the input parameter is nullptr.

将其设置为非显式将允许代码工作,但它也将允许如下语句:

string s = 144;  // [4]

在这方面我有以下问题:

[a] 有没有办法使用“显式”构造函数来启用 string s = 's'; 而不是 string s = 144;

[b] [4] 引起的错误表明它试图将构造函数调用与 string(const char*) 匹配,为什么会这样?如果我们有一个构造函数 string(char ch)

[c] 如果无法通过“显式”构造函数实现 [a],那么实现它的(正确)方法是什么。

附言此代码显示了部分实现。欢迎访问https://github.com/singhkapil2905/cplusplus-string-implementation查看完整的实现。

感谢您的帮助:)

最佳答案

编译器试图匹配 string(char const *) 构造函数只是因为另一个是 explicit,因此在复制初始化时被忽略。

要允许从char 进行复制初始化,第一步确实是将string(char) 实现为非显式。那么您需要防止从 int 进行复制初始化,就是避免转换为 char。您可以通过提供和删除更匹配的构造函数来简单地做到这一点:

string(int) = delete;

请注意,在任何情况下,string s('a'); 都可以使用 explicit 构造函数,因为它是直接初始化的。

关于c++ - 是否可以编写便于复制初始化的显式构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54096318/

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