我正在尝试编写一个C ++类,其构造函数只接受字符串文字,而不接受其他形式的字符串。当我们知道在整个程序执行期间字符串内容是常量时,目标是为文字字符串缓存自定义字符串对象的构造。这是我的实施:
class LiteralString
{
public:
template <int N> LiteralString(const char (&str)[N]) : string(str) {}
LiteralString(char* str) = delete;
operator const char*() const { return string; }
private:
const char* string;
};
它接受const char[N]
,但明确禁止char[N]
,通常在堆栈上的临时缓冲区中使用。隐式构造函数是透明地接受文字字符串。现在考虑一个结构中的LiteralString
,如下例所示:
struct tTest
{
LiteralString text;
};
static const tTest test = { "Foo" } ;
上面的小片段在Clang(Apple版本5.1)和Visual Studio 2013上成功编译。但是GCC(Android版本4.8)无法编译。然而,GCC使用明确的test = { LiteralString("Foo") }
编译。
我的问题是:上面的代码是有效的C ++ 11吗?在这种情况下,GCC 4.8中可能存在错误。否则,Clang和VS编译器太宽容了。
答案 0 :(得分:3)
我正在尝试编写一个C ++类,其构造函数只接受字符串文字而不接受其他形式的字符串。
这是不可能的。无法区分const char
的数组源。