相关疑难解决方法(0)

为什么用户定义的字符串文字和整数文字具有不同的行为?

我正在学习用户定义的文字,并与以下测试代码混淆:

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++ user-defined-literals c++11

20
推荐指数
1
解决办法
2095
查看次数

用户定义的数字文字可以紧跟一个点吗?

从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()以往任何时候都有效吗?


一些额外的信息:


我倾向于认为这是一个GCC和Clang错误,因为.它不是有效标识符的一部分.

c++ language-lawyer user-defined-literals c++11

13
推荐指数
1
解决办法
421
查看次数

使用用户定义的文字成员时编译错误

编译此代码时(没有任何标题)

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那里被视为后缀.为什么编译器会这样解析它,而不是停留在点?

c++ user-defined-literals c++11

11
推荐指数
1
解决办法
237
查看次数

当以“E”结尾时,减去十六进制常量时出错

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)

我有一个解决方案(在常量后面和减法之前添加一个空格),所以我主要想知道为什么?这与认为这里有指数有关吗?

https://godbolt.org/z/MhGT33PYP

c++ language-lawyer

9
推荐指数
1
解决办法
181
查看次数