检查是否已定义用户定义的文字

时间:2015-08-27 13:14:27

标签: c++ c++11 c++14

C ++ 11引入了用户定义的文字。所以,我们可以有很酷的东西,比如

constexpr std::complex<double> operator""i(unsigned long long d) {
    return std::complex<double>{0., static_cast<double>(d)};
}

constexpr std::complex<double> operator""i(long double d) {
    return std::complex<double>{0., static_cast<double>(d)};
}

如果已经定义了这些运算符会发生什么?有没有可能检查这个并定义上面的运算符只有它们不存在?

1 个答案:

答案 0 :(得分:2)

如果您担心与非用户定义文字冲突的文字名称(like 0llong),则§2.13.8/ 1(N4296)指定:

  

如果令牌与user-defined-literal和另一种文字类型匹配,则将其视为后者。 [示例:123_km是用户定义的文字,但12LL是整数文字。 -end example]用户定义文字中ud-suffix之前的句法非终端被认为是可以匹配该非终端的最长字符序列。

如果您关心其他库名称冲突,通常最好将文字放在某个名称空间literals中;至少这是Boost和standard library的作用。这样可以防止名称冲突。

无论如何,如果用户定义的文字运算符存在更多竞争重载,则§2.13.8/ 2(N4296)指定:

  

用户定义的文字被视为对文字运算符或文字运算符模板的调用(13.5.8)。要确定具有ud-suffix L的给定用户定义文字X的此调用的形式,在L的上下文中查找其文字后缀标识符为X的literal-operator-id使用非限定名称查找规则(3.4.1)。设S是此查找找到的声明集。 S不应该是空的。

另请注意§17.6.4.3.4/ 1(N4296)规定:

  

不以下划线开头的文字后缀标识符(13.5.8)保留用于将来的标准化。

所以你的i后缀是非法的。