我正在学习用户定义的文字,并与以下测试代码混淆:
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;
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误消息:
错误:没有匹配的文字运算符用于调用'operator'"_ s.count",其参数类型为'unsigned long long'或'const char*',并且没有匹配的文字运算符模板
cout << 4_s.count()<< endl ;
它似乎需要_s.count …
从C++ 11开始,就可以创建用户定义的文字.正如预期的那样,可以从这些文字返回复杂的结构.但是,在尝试使用此类运算符时123_foo.bar():
struct foo {
int n;
int bar() const { return n; }
};
constexpr foo operator ""_foo(unsigned long long test)
{
return foo{ static_cast<int>(test) };
}
int main() {
return 123_foo.bar();
}
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会和克朗拒绝了,说他们找不到operator""_foo.bar.MSVC接受它.如果我改为写123_foo .bar(),那么所有三个编译器都接受它
谁在这?是123_foo.bar()以往任何时候都有效吗?
一些额外的信息:
std::chrono文字也存在问题我倾向于认为这是一个GCC和Clang错误,因为.它不是有效标识符的一部分.
编译此代码时(没有任何标题)
template <typename T>
struct Temperature {
T temp;
explicit Temperature(T t)
: temp(t)
{}
};
Temperature<long double> operator "" _f (long double t)
{
return Temperature<long double>((t - 32) / 1.8);
}
int main()
{
auto t = 100.0_f;
t.temp;
100.0_f.temp; // ERROR AT THIS LINE
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器(Ubuntu 14.04上的g ++ 4.8和clang ++ 3.4)都会抱怨
error: unable to find numeric literal operator ‘operator"" _f.temp’
100.0_f.temp;
^
Run Code Online (Sandbox Code Playgroud)
似乎在_f.temp那里被视为后缀.为什么编译器会这样解析它,而不是停留在点?
int main()
{
0xD-0; // Fine
0xE-0; // Fails
}
Run Code Online (Sandbox Code Playgroud)
第二行无法在 clang 和 gcc 上编译。任何其他十六进制常量结尾都可以(0-9、AD、F)。
错误:
<source>:4:5: error: unable to find numeric literal operator 'operator""-0'
4 | 0xE-0;
| ^~~~~
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案(在常量后面和减法之前添加一个空格),所以我主要想知道为什么?这与认为这里有指数有关吗?