为什么while循环内的可变参数模板函数无法向控制台输出内容?
问题分析与解决方案
方案可行性结论
你用可变参数模板封装通用读写函数的思路是完全可行的,代码无法正常运行是存在几个语法和逻辑疏漏,修复后即可正常工作。
无输出的具体原因
- 局部变量
a未初始化就参与判断:函数内定义的int类型局部变量如果不显式初始化,会保留栈内存上的随机垃圾值。如果随机值本身小于等于100,while(a>100)的判断条件从一开始就不成立,循环体完全不会执行,自然没有任何输出。 - 输出后未刷新控制台缓冲区:
std::cout默认采用行缓冲策略,只有输出内容包含换行符、缓冲区被填满、或者程序主动调用flush操作时,才会把缓冲区的内容打印到控制台。你的write函数输出的Enter a number:末尾没有换行,也没有手动刷新,所以内容会一直停留在缓冲区中,不会显示在控制台。 - 模板参数名不符合C规范:以双下划线、单下划线加大写字母开头的标识符是C标准保留给标准库使用的,你使用的
_args、__args属于非法标识符,可能触发未定义行为。
修复后的代码示例
#include <iostream> // 修改模板参数名为合法标识符,输出后加flush刷新缓冲区 template<typename... Args> void write(Args && ...args) { ((std::cout << args), ...); std::cout.flush(); } template<typename... Args> void read(Args && ...args) { ((std::cin >> args), ...); } auto main() -> int { // 初始化a为大于100的值,保证第一次循环可以进入 int a = 101; while(a > 100) { write("Enter a number: "); read(a); } return 0; }
如果你不需要每次write都强制刷新,也可以在输出字符串末尾加\n换行符,同样会触发缓冲区刷新。
内容的提问来源于stack exchange,提问作者Gil Rovero
相关产品推荐
相关产品推荐

