代码之家  ›  专栏  ›  技术社区  ›  cbuchart

加号在char数组前面意味着什么?[复制品]

  •  5
  • cbuchart  · 技术社区  · 6 年前

    我在读书 this answer 今天注意到 在char数组前面签名,但不知道这意味着什么。

    考虑到我删除它时出现的编译错误,我猜想它可以帮助编译器推断返回类型,但我不知道它是如何工作的。

    测试代码(也) here ):

    #include <iostream>
    
    using namespace std;
    
    auto& operator<<(std::ostream& os, const char (&s)[2]) {
        return os << (*s == ' ' && !s[1] ? +"\n" : +s);
    }
    
    int main() {
        cout << "Hello" << " " << "world" << " " << 2018;
    
        return 0;
    }
    

    拆卸时 体征( sample )它不编译:

    main.cpp:在函数“auto&operator<<(std::ostream&,const char(&)[2])”中:

    main.cpp:6:48:错误:在扣除“auto”之前使用“auto&operator<(std::ostream&,const char(&)[2])”

    return os << (*s == ' ' && !s[1] ? "\n" : s);
                                                ^
    

    main.cpp:在函数“int main()”中:

    main.cpp:10:24:错误:在扣除“auto”之前使用“auto&operator<(std::ostream&,const char(&)[2])”

    cout << "Hello" << " " << "world" << " " << 2018;
                        ^~~
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   songyuanyao    6 年前

    内置一元 operator+ 无法将指针类型(而不是数组类型)作为其操作数,因此在数组上使用它会导致 array-to-pointer decay 然后 +"\n" +s 会回来 const char * .

    另一方面,如果删除 运算符+ ,您将尝试传递类型为的数组 const char[2] os ,这将导致递归调用,正如错误消息试图告诉您的那样。

    对于内置运算符,表达式必须具有算术、非范围枚举或指针类型。如果操作数具有整型或非整型枚举类型,则对其执行整型提升,并确定结果的类型。

    内置的一元加号运算符返回其操作数的值。它不是no op的唯一情况是,操作数具有整型或非整型枚举类型,这些类型通过整型提升而更改,例如,它转换 char int 或者,如果操作数服从左值到右值、数组到指针或函数到指针的转换。

        2
  •  4
  •   StoryTeller - Unslander Monica    6 年前

    这是一元加。内置运算符只能应用于数字类型和指针。如果需要隐式转换,它所做的就是使操作数保持不变。

    自从 s 是对数组的引用,它不能 + 在它衰减到指针之前应用,因此运算符强制进行数组到指针的转换。

    必须这样做的原因是 "\n" 本身是两个字符的常量数组。由于条件表达式具有第二个和第三个操作数的公共类型,因此它将具有 char const(&)[2] 除非预先将一个操作数强制为指针。

    你可以猜出哪个超负荷的 operator<< 会被要求 字符常量(&)[2] 你不能吗?