我刚刚了解到ios_base::sync_with_stdio函数的存在,它基本上允许你关闭(或者如果你已经关闭它)iostream在C++中使用的cstdio流和作为标准C的一部分的流之间的同步.
现在,我一直认为stdout,stderr和stdin用C基本上包裹在一组++的输入输出流类在C对象的.但如果它们必须彼此同步,这将表明C++的iostream类不是 C stdin等的包装器 .
我很困惑这个?有人可以澄清C++的的iostream和C的标准输入输出是如何不同的东西,做同样的事情,只是在不同的抽象级别?我以为他们是一回事!
它们是如何同步的呢?我一直认为它们是同一个东西,一个包装另一个,基本上.
我正在阅读模板完整指南,它说如下:
它在哪里谈论类模板专业化.
但是,如果您专门化类模板,则还必须专门化所有成员函数.虽然可以专门化单个成员函数,但是一旦完成,就不能再专门化整个类了.
我实际上想知道这是怎么回事,因为你可以专门没有任何成员函数.它是说你不能只有一个成员函数的专业化,然后是另一个具有所有成员函数的专业化吗?
有人可以澄清一下吗?
我遇到过这一行:
void (*(*x)(void (*[10])(int *)))(int *)
Run Code Online (Sandbox Code Playgroud)
谁能告诉我它是什么?
我正在创建一个与一些Windows API代码交互的类,现在我必须初始化的一个指针是通过调用初始化它的本机函数来完成的.
我的指针是std::unique_ptr带有自定义删除器的类型,它调用所提供的WinAPI删除函数,但是我不能将带有&address-of运算符的unique_ptr传递给init-function.为什么?
我创建了一个演示我的问题的示例:
#include <memory>
struct foo
{
int x;
};
struct custom_deleter {};
void init_foo(foo** init)
{
*init = new foo();
}
int main()
{
std::unique_ptr<foo, custom_deleter> foo_ptr;
init_foo(&foo_ptr);
}
Run Code Online (Sandbox Code Playgroud)
编译器咆哮并说:
source.cpp: In function 'int main()':
source.cpp:19:21: error: cannot convert 'std::unique_ptr<foo, custom_deleter>*' to 'foo**' for argument '1' to 'void init_foo(foo**)'
Run Code Online (Sandbox Code Playgroud) 在C++ 11中,它是未定义的行为,但在C中的情况while(1);是未定义的行为吗?
在C++中,您是否始终使用new关键字初始化指向对象的指针?
或者你也可以这样做:
MyClass *myclass;
myclass->DoSomething();
Run Code Online (Sandbox Code Playgroud)
我以为这是在堆栈而不是堆上分配的指针,但由于对象通常是堆分配的,我认为我的理论可能有问题?
请指教.
在编写一个带有传递给它的args的C++函数时,如果可以保证不改变对象,则应始终使用const,如果指针不会被更改,则应始终使用const指针.
这种做法何时建议?
你什么时候使用const引用,比仅通过指针传递它有什么好处?
那么void MyObject::Somefunc(const std::string& mystring) 如果一个字符串实际上已经是一个不可变对象,那么拥有一个const字符串会有什么意义呢?
我的程序中有一个boost :: variant,我想检查变量本身是否已初始化,以及其中一个类型中是否包含值.
我在变种上尝试过empty(),但这似乎不起作用.也没有检查NULL.
有人知道怎么检查吗?
编辑:好的,它似乎永远不会是空的,但它的包含类型并不总是有值,所以如何检查无值情况?