c++ - C++17 是否允许非 ascii 字符作为标识符?
问题描述
在cppref,我发现了一个奇怪的 C++ 代码,它在源代码中使用了一个非 ascii 字符,如下所示:
template <char...> double operator "" _π(); // OK
但是,上面的代码不能用 clang 6.0 编译。错误信息是:
error : source file is not valid UTF-8
1>double operator "" _<A6><D0>()
1> ^
我的问题是:
- 这符合 C++17 吗?
- 注意 user-defined
_π
没有参数,那么,如何使用_π
呢?只用double var = _π;
?
解决方案
从您提供的链接中,它引用:
如果字面量操作符是一个模板,它必须有一个空的参数列表,并且只能有一个模板参数,它必须是一个元素类型为char的非类型模板参数包
template <char...> double operator "" _x();
让我们看看这意味着什么,
符号char...
表示该模板可以用 0、1、2 或更多类型的参数实例化char
。这意味着每次编译器遇到类似的文字时,1234_km
它都应该将其视为以下函数调用:
operator"" _km<'1', '2', '3', '4'>();
表示文字的整个字符串作为模板参数传递(切碎)。请参阅this和this以了解用法。
以及关于允许的字符范围:(见附件 E)
00A8, 00AA, 00AD, 00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF
0100-167F, 1681-180D, 180F-1FFF
200B-200D, 202A-202E, 203F-2040, 2054, 2060-206F
2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
3004-3007, 3021-302F, 3031-303F
3040-D7FF
F900-FD3D, FD40-FDCF, FDF0-FE44, FE47-FFFD
10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD,
60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD,
B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD
推荐阅读
- google-sheets - 谷歌表格将数据添加到下拉列表
- ladder-logic - 如何在 Scheinder 梯形程序中使用 SYSTIMEDATE
- python - ModuleNotFoundError:运行 Pyinstaller 时没有名为 PIL 的模块
- r - 比较两个数据帧之间的纬度和经度
- swift - 如何更改 Xcode 为每个堆栈创建单独的预览?
- python - Python:AttributeError:模块'kubernetes'没有属性'config'
- vimeo - vimeo API 如何进行批量请求
- reactjs - 如何生成动态 React 标记
- node.js - 公牛在第一次之后没有增加新的工作
- vue.js - 如何将本地存储值传递给控制器 laravel?