用户定义的文本作为可变参数模板

User-defined literals as variadic templates

本文关键字:变参 参数 定义 文本 用户      更新时间:2023-10-16

GCC 4.7.2 似乎具有仅针对数字实现的可变字符模板文本运算符:

template<char... chars>
constexpr size_t operator "" _size() { return sizeof...(chars); }
int main()
{
    std::cout << 42_size;    // (1) works
    std::cout << "foo"_size; // (2) does not
}
  • 是否有支持此代码的 GCC 版本?
  • (2)甚至是标准的一部分吗?

2.14.8.5 的 C++11 标准声明

如果 L 是用户定义的字符串文本,则让 str 是没有 它的 ud 后缀和 let len 是 str 中的代码单元数(即 其长度不包括终止空字符)。字面 L 是 视为表单运算符 " X (str, len) 的调用

因此,请将代码重写为:

#include <iostream>
// (1)
template<char... chars>
constexpr size_t operator "" _size() { return sizeof...(chars); }
// (2)
constexpr size_t operator "" _size( const char* str, size_t sz ) { return sz; }
int
main(void)
{
  std::cout << 42_size << std::endl;    // (1)
  std::cout << "foo"_size << std::endl; // (2)
  return 0;
}

显式指定 (2) 的正确形式