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)};
}
如果已经定义了这些运算符会发生什么?有没有可能检查这个并定义上面的运算符只有它们不存在?
答案 0 :(得分:2)
如果您担心与非用户定义文字冲突的文字名称(like 0l
为long
),则§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
后缀是非法的。