简单的I/O操纵器无法按预期工作

ben*_*ben 4 c++ io

以下代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    std::cout << my_manip << 8.8888888 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印:

8.88889

18.88889
Run Code Online (Sandbox Code Playgroud)

而以下代码:

#include <iostream>

std::ios_base &my_manip (std::basic_ios<char> &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

int main (int argc, char **argv) {
    std::cout << 8.8888888 << std::endl;
    my_manip(std::cout);
    std::cout << 8.8888888 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印预期结果:

8.88889

8.888889e+00
Run Code Online (Sandbox Code Playgroud)

谁能告诉我第一个版本有什么问题?

P0W*_*P0W 5

自定义操纵器签名不匹配,

你应该这样做:

std::ostream& my_manip (std::ostream &os) {
    os.unsetf(std::ios_base::basefield);
    os.setf(std::ios_base::scientific);
    return os;
}

std::cout << my_manip << 8.8888888 << std::endl;
Run Code Online (Sandbox Code Playgroud)