Stack Overflow教给我的很多东西都是所谓的"最令人烦恼的解析",经典地用一条线来证明
A a(B()); //declares a function
Run Code Online (Sandbox Code Playgroud)
虽然这对于大多数人而言,直观地看起来是a类型对象的声明A,将临时B对象作为构造函数参数,它实际上是一个函数a返回的声明A,将一个指针指向一个返回的函数,它B本身不带参数.同样的线
A a(); //declares a function
Run Code Online (Sandbox Code Playgroud)
也属于同一类别,因为它代替一个对象,它声明了一个函数.现在,在第一种情况下,这个问题的通常解决方法是在其周围添加一组额外的括号/括号B(),因为编译器会将其解释为对象的声明
A a((B())); //declares an object
Run Code Online (Sandbox Code Playgroud)
但是,在第二种情况下,执行相同操作会导致编译错误
A a(()); //compile error
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么?是的我非常清楚正确的"解决方法"是将其更改为A a;,但我很想知道()第一个示例中的额外功能是什么,然后在重新应用它时不起作用第二个例子.A a((B()));变通办法是否是写入标准的特定异常?
有没有办法创建一个基本上什么都不做的ostream实例?
例如 :
std::ostream dummyStream(...);
dummyStream << "Nothing will be printed";
Run Code Online (Sandbox Code Playgroud)
我可以创建一个ostringstream,但数据将被缓冲(我真的不想用它们做任何事情,所以它增加了无用的开销).
任何的想法 ?
[编辑]找到适合我需要的相关问题.但是,我认为如何使用标准c ++ 创建有效(无badbit)输出流的答案可能会有用.
我有一个这样的代码:
# in class definition
std::ofstream m_myFile;
## some where in code
m_myFile.open(filename);
Run Code Online (Sandbox Code Playgroud)
然后在几个地方,我写文件如下:
m_myFile << "some data to file"<<std::endl;
Run Code Online (Sandbox Code Playgroud)
这运行良好,现在我需要向系统添加一个标志,当未设置时,不应创建和写入此文件。我已经检查过,如果我这样做,我可以运行该应用程序:
if(createFile)
{
m_myFile.open(filename);
}
Run Code Online (Sandbox Code Playgroud)
并将写入文件保持原样,我在 Windows 上没有收到任何运行时错误。我的问题是,如果我没有打开文件并写入其流,那么标准行为是什么?
我应该得到运行时错误还是 ofstream 只是忘记数据而不是运行时错误?
我正在使用 Visual Studio 2013。
我使用类似的函数
void doStuff(type thing, bool print = false, std::ostream& S = std::cout)
{
thing++;
if(print)
S << "new thing: " << thing << '\n';
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用相同的函数并决定调用是否希望它打印正在发生的事情的文档以及如果我希望我可以在单独的流上打印它 - 我不知道我是否可以使用 std:: 来做到这一点奥流-
我现在相信这样做会更好
void doStuff(type thing, std::ostream& S = NULL)
{
thing++;
if(S)
S << "new thing: " << thing << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为 std::ostream 不接受 NULL
问题:
- 是否有某种类型的流类型常量可以停止 if 条件?
- 我可以使用更灵活的不同类型的流来接受字符串流和文件流等流吗?
- 有更好的方法来处理灵活的文档吗?