理解用户定义的字符串文字编译器错误“.. is not a variable”

问题描述

我想知道这两个字符串 UDL 之间的区别。虽然第一个编译良好,但第二个出现错误

唯一的区别是 Literal1 使用 std::array 作为存储,而 Literal2 使用 const char *

我可以轻松地显式构造一个 Literal2,但是一旦我尝试使用 UDL 编译就会失败并显示 '"123"' is not a valid template argument of type 'const char*' because '"123"' is not a variable。有趣的是,如果我不在构造函数中初始化 p,它也能很好地编译。

template < size_t size >
struct Literal1 : std::array<char,size>
{
    constexpr Literal1(char const (&str)[size+1]) { for (size_t ii = 0; ii < size; ++ii) (*this)[ii] = str[ii]; }
};

template < size_t size > Literal1(char const (&str)[size]) -> Literal1<size-1>;
template < Literal1 literal > constexpr auto operator "" _lit1() { return literal; }


template < size_t size >
struct Literal2 
{
    const char* p{};

    constexpr Literal2(char const (&str)[size+1])  : p(str)  {  }
};


template < size_t size > Literal2(char const (&str)[size]) -> Literal2<size-1>;
template < Literal2 literal > constexpr auto operator "" _lit2() { return literal; }

int main() {

    constexpr auto l1 = "123"_lit1;

    constexpr auto l2 = "123"_lit2; // Compiler error....
    constexpr Literal2 l3{"123"}; // Works...
}

谁能解释一下这里有什么区别?为什么 UDL 失败?

有趣的是,事实证明编译器之间也存在分歧。 GCC 的行为如上所述,而 clang 抱怨这两个 UDL 定义。也许 C++ 模板 UDL 没有在 clang 中完全实现,因为我的示例基本上是在 this cppreference 页面(最底部)上显示内容

现场示例here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)