kap*_*pil 1 c++ string compiler-errors c++11
我实际上正在编写字符串的实现,并且在尝试从单个字符构造字符串时面临着令人困惑的情况.
mystring.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;
};
Run Code Online (Sandbox Code Playgroud)
mystring.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);
}
Run Code Online (Sandbox Code Playgroud)
TEST.CPP
#include "my_string.h"
using namespace kapil;
int main() {
string z8 = 'c'; // [3]
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,[3]不编译,string(char ch)因为string 的构造函数是显式的.[3]给出以下错误:
Run Code Online (Sandbox Code Playgroud)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]
Run Code Online (Sandbox Code Playgroud)
我在这方面有以下问题:
[a]有没有办法,使用'explicit'构造函数来启用string s = 's';但不启用string s = 144;
[b]由[4]引起的错误表明它试图匹配构造函数调用string(const char*),为什么会这样?只要我们有一个构造函数string(char ch).
[c]如果没有办法用'explicit'构造函数实现[a],那么实现它的方法是什么(正确).
PS此代码显示部分实现.请访问https://github.com/singhkapil2905/cplusplus-string-implementation以查看完整的实施.
谢谢你的帮助 :)
编译器尝试匹配string(char const *)构造函数只是因为另一个是explicit,因此在复制初始化中被忽略.
为了允许从a进行复制初始化char,第一步确实string(char)是以非实现方式实现explicit.那么你需要防止复制初始化int是为了避免转换为char.您可以通过提供和删除更匹配的构造函数来实现:
string(int) = delete;
Run Code Online (Sandbox Code Playgroud)
请注意,在任何情况下,都string s('a');使用explicit构造函数,因为它是直接初始化.
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |