c++ - 临时调用 operator<<

标签 c++ operator-overloading

考虑以下代码( godbolt ):

#include <fstream>
#include <string>
#include <filesystem>

namespace fs = std::filesystem;

using namespace std::string_literals;

template<class CharT, class Traits>
void test(std::basic_ostream<CharT, Traits> &s) {
    s << "Other test\n"s;
}

struct my_struct {
    std::string s = "My Struct\n"s;
};

template<class CharT, class Traits>
std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &stream,
                                              const my_struct &s) {
    stream << s.s;
    return stream;
}

int main() {
    fs::path file("test.txt");
    const my_struct s;

    // A
    operator<<(std::ofstream(file, std::ios_base::app), "Other test!\n"s);   // Runs fine
    std::ofstream(file, std::ios_base::app) << "Das ist ein Test!\n"s;       // Runs fine

    // B
    operator<<(std::ofstream(file, std::ios_base::app), s);                  // Runs fine
    std::ofstream(file, std::ios_base::app) << s;                            // Runs fine

    // C
    // test(std::ofstream(file, std::ios_base::app));                        // Does not compile
}
代码部分 A 和 B 编译得很好,而 C 则不然。很明显test不能采用右值,因为参数是非 const引用。
但不应该AB是相同的?两者operator<< STL 和我自己的将左侧视为非 const引用。那么为什么他们可以使用临时对象呢?
编译器:
clang version 10.0.0 
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0
Found candidate GCC installation: /usr/lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/10.1.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
编辑:问题的第一个版本有一个错误,导致自己的 operator<<段错误。

最佳答案

So why is it possible for them to work with a temporary object?


因为,不像你的operator << ,一些来自标准库的不是免费的,但是 member functions它可以毫无问题地轻松处理临时对象,而非成员函数具有 explicit overload采用右值(或更准确地说,前向)引用。

关于c++ - 临时调用 operator<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62896652/

相关文章:

c++ - 内部和外部重载 C++ 运算符之间的区别

c++ - 如何在它之外的模板类中使用模板参数?

c++ - Qt + CMake + VC++ 生成命令提示符

c++ - 如何通过 usb Lacewing::Client 接收数据?

c++ - 将 mysql embedded 和 --local-infile=1 与 c++ 一起使用?

c++ - 几个 vector 的笛卡尔积

c++ - 使用模板重载运算符 ()

c++ - 隐式转换运算符重载语法

c++:运算符重载和错误处理

c++ - 丢失目标时如何重置或更新 KCF 跟踪器 ROI