c++ - 是否可以编写有助于复制初始化的显式构造函数?
问题描述
我实际上正在编写字符串的实现,并且在尝试从单个字符构造字符串时面临一个令人困惑的场景。
我的字符串.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)
因为 string 的构造函数是显式的。[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],那么实现它的(正确)方法是什么。
PS 此代码显示部分实现。请访问https://github.com/singhkapil2905/cplusplus-string-implementation查看完整的实现。
谢谢你的帮助 :)
解决方案
编译器尝试匹配string(char const *)
构造函数只是因为另一个是explicit
,因此在复制初始化中被忽略。
要允许从 a 进行复制初始化char
,第一步确实是实现string(char)
为非explicit
. 然后,您需要防止从 an 复制初始化int
是避免转换为char
. 您可以通过提供和删除更匹配的构造函数来做到这一点:
string(int) = delete;
请注意,在任何情况下,也string s('a');
可以与explicit
构造函数一起使用,因为它是直接初始化的。
推荐阅读
- javascript - Dust.js 双向数据绑定
- sql - 如何从 id 获取用户名
- google-tag-manager - GTM - 获取点击 URL 变量的未定义值
- php - MYSQL - 如何用相同的值替换 INTO?
- python - Timedelta 索引的 IF 其他条件
- c++ - 如何使用协议缓冲区进行从 c++ 到 c# 的数据传输
- odoo - 根据其他模型字段状态在销售订单中进行过滤
- azure-language-understanding - LUIS 给出 403 响应,其中包含“呼叫量配额不足”。
- c# - 我在哪里可以找到 Visual Studio 2017 中的 trackbar winforms 控件?
- netty - 如何使用 h2load 为基于 Netty 的 http2 服务器做基准测试?