C++ c++;使用赋值运算符模拟类型转换

C++ c++;使用赋值运算符模拟类型转换,c++,c++11,constructor,operator-overloading,C++,C++11,Constructor,Operator Overloading,这是我的课-- 但我实际上想做的是模仿语句stuff s5(“bcd”),说stuff s5=“bcd” 如何实现这样的编码构造?这不会编译,因为隐式构造函数采用const std::string&而不是const char*const char*可转换为const std::string,但编译器将只执行一次隐式转换以尝试实现构造函数。您可以通过添加一个构造函数来解决这个问题,该构造函数接受const char*并委托给字符串构造函数(需要C++11): 您需要一个转换构造函数,它采用cons

这是我的课--

但我实际上想做的是模仿语句
stuff s5(“bcd”)
,说
stuff s5=“bcd”


如何实现这样的编码构造?

这不会编译,因为隐式构造函数采用
const std::string&
而不是
const char*
const char*
可转换为
const std::string
,但编译器将只执行一次隐式转换以尝试实现构造函数。您可以通过添加一个构造函数来解决这个问题,该构造函数接受
const char*
并委托给字符串构造函数(需要C++11):


您需要一个转换构造函数,它采用
constchar*
。在C++11或更高版本中,这可能会委托给现有的
string
构造函数:

stuff(const char * s) : stuff(std::string(s)) {}
从历史上看,或者如果您希望避免创建临时字符串,那么它可能是最简单的

stuff(const char * s) {
    this->s_val = s[0];
    this->e_val = s[std::strlen(s)-1];
}
(遵循构造函数主体中的赋值惯例,而不是直接初始化。)

如果没有这一点,就不允许从字符串文本进行隐式转换,因为它需要两个用户定义的转换(
const char*
std::string
stuff
),但隐式转换序列只能涉及一个。显式转换(如
stuff s5(“bcd”);
)可以通过
字符串
构造函数完成


您还可以删除复制构造函数和复制赋值运算符:它们的作用与隐式生成的构造函数完全相同。

我曾试图重现您的问题,但无法重现。你的编译器是什么?我使用的是VS 2012。
g++4.8.2
它应该支持
c++11
你是用
--std=c++11
编译的吗?@cbuchart:一个合格的编译器应该拒绝这个。我猜您的编译器错误地允许在隐式转换序列中进行两次用户定义的转换(
constchar*
string
stuff
)。标准规定只允许一个。对,VS 2012不是完全一致的,所以这可能就是为什么它对我有效。
error: conversion from ‘const char [4]’ to non-scalar type ‘stuff’ requested
stuff(const char* s) : stuff {std::string{s}} {}
stuff(const char * s) : stuff(std::string(s)) {}
stuff(const char * s) {
    this->s_val = s[0];
    this->e_val = s[std::strlen(s)-1];
}