相关疑难解决方法(0)

C++:"std :: endl"vs"\n"

许多C++书籍都包含这样的示例代码......

std::cout << "Test line" << std::endl;
Run Code Online (Sandbox Code Playgroud)

......所以我也一直这样做.但我已经看到很多来自像这样的开发人员的代码:

std::cout << "Test line\n";
Run Code Online (Sandbox Code Playgroud)

是否有技术上的理由偏爱另一个,或者仅仅是编码风格的问题?

c++ iostream coding-style c++-faq

530
推荐指数
10
解决办法
18万
查看次数

为什么输出流优先使用“ \ n”而不是“ \ n”?

这个答案中,我们可以看到:

我猜想using '\n'或using 之间没有什么区别"\n",但是后者是一个(两个)字符的数组,必须逐个字符地打印,为此必须建立一个循环,这比输出单个字符更为复杂。

重点矿

这对我来说很有意义。我认为,输出const char*需要一个循环,这将测试空终止符,其必须推出比更多的操作,比方说,一个简单的putchar(不是暗示std::coutchar代表们呼吁-它只是引进一个实例的简化)。

说服我使用

std::cout << '\n';
std::cout << ' ';
Run Code Online (Sandbox Code Playgroud)

而不是

std::cout << "\n";
std::cout << " ";
Run Code Online (Sandbox Code Playgroud)

在这里值得一提的是,我知道性能差异几乎可以忽略不计。但是,有些人可能会争辩说,前一种方法的意图是实际上传递单个字符,而不是恰好是一个char长字符(如果算上是2 char s '\0')的字符串文字。

最近,我为使用后一种方法的人做了一些代码修改。我对此案发表了一点评论,然后继续。然后,开发人员感谢我,并说他甚至都没有想到这种差异(主要集中在意图上)。完全没有影响(毫不奇怪),但是采用了更改。

然后,我开始怀疑这种变化到底有多重要,所以我狂奔。令我惊讶的是,当在带有标志的GCC(树干)上进行测试时,它显示出以下结果-std=c++17 -O3。为以下代码生成的程序集:

#include <iostream>

void str() {
    std::cout << "\n";
}

void chr() {
    std::cout << '\n';
}

int main() {
    str();
    chr();
}
Run Code Online (Sandbox Code Playgroud)

我很惊讶,因为看起来chr() …

c++ performance cout string-literals

29
推荐指数
3
解决办法
1549
查看次数

使用std :: ostream打印可变参数包的最简单方法是什么?

使用逗号分隔的参数包的最简单方法是什么std::ostream

例:

template<typename... Args>
void doPrint(std::ostream& out, Args... args){
   out << args...; // WRONG! What to write here?
}

// Usage:
int main(){
   doPrint(std::cout,34,"bla",15); // Should print: 34,bla,15
}
Run Code Online (Sandbox Code Playgroud)

注意:可以假设<<操作员的相应过载可用于所有类型的参数包.

c++ templates variadic-templates c++11

25
推荐指数
4
解决办法
1万
查看次数

C++链接运算符<< for std :: cout like usage

可能重复:
当重载operator << Operator重载时,std :: endl的类型未知

我目前正在编写一个记录器类,但该operator<<方法会导致编译器错误.这是类的最小化版本,在文件"logger.h"中:

#include <iostream>
class Logger {
public:
    Logger() : m_file(std::cout) {}

    template <typename T>
    Logger &operator<<(const T &a) {
        m_file<<a;
        return *this;
    }

protected:
    std::ostream& m_file;
};
Run Code Online (Sandbox Code Playgroud)

它包含在我的main.cpp中,并在输出字符串文字时完美地工作:

log << "hi"; 
Run Code Online (Sandbox Code Playgroud)

但是,以下内容无法编译.

#include "logger.h"
int main() {
    Logger log;

    log << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

g ++编译器报告:

src/main.cpp:5:错误:'log << std :: endl'中'operator <<'不匹配

c++ operators chaining

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