GCC中可能存在的错误:结构中的文字字符串类型

时间:2014-06-03 11:14:48

标签: c++ gcc c++11 string-literals

我正在尝试编写一个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编译器太宽容了。

1 个答案:

答案 0 :(得分:3)

  

我正在尝试编写一个C ++类,其构造函数只接受字符串文字而不接受其他形式的字符串。

这是不可能的。无法区分const char的数组源。