问题描述
我想知道这两个字符串 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 (将#修改为@)