是否有任何可能的方法强制使用字符串文字进行隐式构造函数初始化
Is there any possible way to force implicit constructor initialization with a string literal
假设我有一个类
class Foo
{
public:
Foo(int x);
Foo(std::string s);
}
我希望能够初始化像这样的对象
int main()
{
Foo f1 = "some string"
}
而不是
int main()
{
Foo f1("some string");
}
到目前为止,我收到了一个编译器错误:错误:从"const char*"到"int"的转换无效[-fpermission]|
我所能想到的就是制作一个接受char*参数的额外构造函数,但我希望避免这种冗余。
虽然看起来不明显,但在副本初始化的情况下有两种用户定义的转换:
Foo f1 = "some string";
在上面的表达式中,Foo f1 =
是对Foo(Foo const &)
的调用,右手边作为自变量。为此,编译器需要弄清楚如何从literal(N个字符的数组)到Foo
,这需要用户定义的到std::string
的转换(采用const char*
的构造函数)和第二个用户定义的从std::string
到Foo
的转换(上面的第二个构造函数)。
现在,为什么第二种情况不需要相同数量的转换似乎并不明显……当你执行Foo f("something");
时,编译器会考虑三个重载:
Foo(int);
Foo(std::string);
Foo(Foo const &);
没有从字面到int
的转换,因此第一个被丢弃。有一个从字面到std::string
的一步转换(通过构造函数获取const char*
),所以这是一个可行的候选者。如上所述,不存在从字面到Foo
的一步转换,因此也会丢弃一个,而选择唯一可行的候选者。
这种语言非常清楚,因为在转换序列中只能有用户定义的转换,所以在那里什么都做不了。因此,您要么提供另一个构造函数,要么确保右侧是std::string
。为此,您可以显式转换(在C++03中有效):
Foo f1 = std::string("something");
您也可以将此问题留给用户,并要求他们进行直接初始化,而不是复制初始化。或者,您可以添加一个采用const char*
的构造函数。
相关文章:
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 如何在 C 宏中将变量字符串与文字字符串连接起来?
- 我如何知道 boost::any 是否包含文字字符串
- C 专用模板功能接收文字字符串
- 如何使变量成为文字字符串
- 可以一个#define一个文字字符串,其中包含用于资源文件的非ANSI字符的字符串
- 从文字字符串生成编译时常量整数
- 当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
- 如何在 C 或C++宏中使用函数作为文字字符串
- GCC中可能的错误:结构中的文字字符串类型
- 文字字符串有效,但字符串在 file.open() 中不起作用
- C/C++:文字字符串中"xNNN"格式的固有歧义
- constexpr函数中声明为静态的文字字符串