【发布时间】:2018-05-08 02:46:57
【问题描述】:
我正在学习用户定义的文字,但对以下测试代码感到困惑:
std::chrono::seconds operator"" _s(unsigned long long s) {
return std::chrono::seconds(s);
}
std::string operator"" _str(const char *s, std::size_t len) {
return std::string(s, len);
}
int main() {
auto str = "xxxxx"_str;
std::cout << str.size() << std::endl; // works
auto sec = 4_s;
std::cout << sec.count() << std::endl; // works
std::cout << "xxxxx"_str.size() << std::endl; // works
std::cout << 4_s.count() << std::endl; // does **NOT** work!
return 0;
}
编译器给出以下错误信息:
错误:没有匹配的文字运算符用于调用具有“unsigned long long”或“const char *”类型的参数的“operator”“_s.count”,并且没有匹配的文字运算符模板
cout
似乎它需要 _s.count 作为用户定义的文字。此外,浮点文字的行为类似于整数文字。
为什么用户定义的整数文字和字符串文字有不同的行为?
【问题讨论】:
-
(4_s).count 怎么样?
-
(4_s).count有效。ud-suffix中不能有(或)。 -
@for_stack 好像很奇怪,
.也不能在ud-suffix中使用;无法理解为什么_s.count被解析为整个ud-suffix。 -
@songyuanyao 很高兴见到你。能找到解释也就不奇怪了。
-
4_s.count被解析为preprocessing number 标记,这是预处理器容忍的,在预处理之后但在句法和语义分析之前是converted to a token,但它不能转换为有效的令牌(例如整数文字或浮动文字),因此违反了[lex.pptoken]/1。诚然,在这种情况下,编译器错误完全没有帮助。
标签: c++ c++11 user-defined-literals