【问题标题】:Does C++17 allow a non-ascii character as an identifier?C++17 是否允许非 ascii 字符作为标识符?
【发布时间】:2018-04-24 13:49:18
【问题描述】:

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>                    ^

我的问题是:

  1. 这符合 C++17 吗?
  2. 注意自定义是没有参数的,那么怎么用呢?只需使用double var = _π;

【问题讨论】:

  • 我认为这里的关键元素是 &lt;char...&gt; 将表示与文字一起使用的字符集,它基本上取代了参数。所以2.5_π; 会使用模板参数&lt;'2','.','5'&gt; 调用operator "" _π()
  • pi 字符可以正常工作ideone.com/6AGIX0 你使用的是什么环境(操作系统、shell)? A6D0 看起来不像 pi 的有效 UTF-8 编码。
  • A6 D0 不是 UTF-8 序列。检查您的编辑器或 IDE 以确保您将源文件保存为 UTF-8。

标签: c++ compiler-errors standards c++17 user-defined-literals


【解决方案1】:

从您提供的链接中,它引用:

如果文字操作符是一个模板,它必须有一个空参数 list 并且只能有一个模板参数,它必须是 元素类型为 char 的非类型模板参数包

template <char...> double operator "" _x();

让我们看看这意味着什么,

符号char... 表示该模板可以用char 类型的0、1、2 个或更多参数进行实例化。这意味着每次编译器遇到像1234_km 这样的文字时,它应该将其视为以下函数调用:

operator"" _km<'1', '2', '3', '4'>();

表示文字的整个字符串作为模板参数传递(切碎)。用法见thisthis

关于允许的字符范围:(见Annexure 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

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多