如果我有一个std::ostringstream被调用的对象oss,我知道我可以std::cout << oss.str()打印出字符串.但这样做oss.str()会导致返回的字符串被复制.有没有办法直接打印底层streambuf?
提前致谢!
考虑一下这个C++ 1y代码(LIVE EXAMPLE):
#include <iostream>
auto foo();
int main() {
std::cout << foo(); // ERROR!
}
auto foo() {
return 1234;
}
Run Code Online (Sandbox Code Playgroud)
编译器(GCC 4.8.1)慷慨地发现了这个错误:
main.cpp:在函数'int main()'中:
main.cpp:8:18:错误:在扣除'
auto'std :: cout << foo()之前使用'auto foo()'
^
我如何foo()在这里转发声明?或者更恰当的说,是否有可能向前宣布foo()?
我也尝试编译代码,我试图foo()在.h文件中声明,foo()就像.cpp文件中的上面一样,包含.h在我的main.cpp文件包含int main()和调用foo(),并构建它们.
发生了同样的错误.
可能重复:
C++ 11中默认函数的重点是什么?
C++ 11引入了默认方法(例如void myMethod() = default;).
它对方法有什么作用(方法在default编辑后如何表现).我该如何正确使用它们(它的用途是什么)?
声明符.是的,声明者.它们是许多编码约定辩论的来源.对于参数来说这是一个非常好的主题--C++并不排除哪一个比另一个好(它不关心!).所以我们可以写这些而不用担心有人会取笑你:
int x;
int& a = x;
int &b = x;
int* c = &x;
int *d = &x;
Run Code Online (Sandbox Code Playgroud)
在句法上,b并且d比其他人"更有效".我们需要在名称前加上声明符修饰符:
int m, *n; // m is an int; n is a pointer to int
Run Code Online (Sandbox Code Playgroud)
但潮流似乎转而支持一个.使用C++ 11的可变参数模板,声明符的位置似乎仅限于修饰符更接近基本类型的形式:
template<typename... Ts>
void VariadicFuncRef(const Ts&... args) { }
^
template<typename... Ts>
void VariadicFuncPtr(Ts*... args) { }
^
Run Code Online (Sandbox Code Playgroud)
写这些表单是错误的:
template<typename... Ts>
void VariadicFuncRef(const Ts... &args) { }
template<typename... Ts>
void VariadicFuncPtr(Ts... *args) { }
Run Code Online (Sandbox Code Playgroud)
有关具体示例,请单击此处.
所以,我的问题是: 为什么我们仅限于这种(合法的)形式而不能使用另一种形式?
有什么想法吗?
附加1: …
尝试编译以下代码:
struct Foo
{
explicit Foo ( void ) { }
explicit Foo ( Foo&& rhs ) { }
};
Foo bar ( void )
{
return Foo();
}
Run Code Online (Sandbox Code Playgroud)
收到以下错误:
调用隐式删除的'Foo'复制构造函数
好吧,很明显,拷贝代码被隐式删除了.
问题1:为什么编译器需要copy-ctor Foo?我期望使用move-ctor bar从rvalue构造返回值Foo().
然后我将move-ctor重新声明为隐式,并且所有内容都成功编译.
问题2:当我将move-ctor重新声明为隐式时,为什么编译器不再需要copy-ctor?
问题3:什么是explicit关键词意味着副本的背景和移动构建函数,因为它肯定意味着什么从正规构建函数的背景不同.
请考虑以下代码:
struct test {
auto func() -> decltype(data) {} // ERROR
int data;
};
int main() {
test t;
t.func();
}
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
main.cpp:2:29: error: 'data' was not declared in this scope
auto func() -> decltype(data) {}
Run Code Online (Sandbox Code Playgroud)
但是,如果我放在data上面func(),它没有错误(实时代码):
struct test {
int data;
auto func() -> decltype(data) {}
};
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么decltype不考虑在它之后声明的成员(何时decltype用于方法声明,而不是在定义中)?我还想知道在将来的语言标准迭代中这种行为是否有任何变化.
decltype表现得与众不同.我的编码约定是将类数据成员放在类函数下面.当然,这种不同的行为会影响我组织班级成员的方式.如果您能提供可以保留我的编码约定的任何解决方法,我将非常感激. 我总是可以测试这个,但我想要一位PHP专家的正式答案(我肯定不会这样).
如果有人提出这样的请求:
http://www.somedomain.com/a.php?param1=value1¶m2=value2¶m3=value3?param1=value4¶m2=value5¶m3=value6
Run Code Online (Sandbox Code Playgroud)
_GET['param2']例如,当我尝试访问时会出现什么样的后果?看起来我只是得到第一个值.在这种情况下,它会返回value2.这是预期的行为吗?
第二个问号会影响什么吗?例如,会有错误吗?
假设我有这个功能模板:
template<typename T1, typename T2>
auto DoSomething(const T1& arg);
Run Code Online (Sandbox Code Playgroud)
当然这个函数需要一个尾随返回类型,考虑到函数的目的,我真的不能正确.
这个函数应该做的是使用和对象arg做一些操作,并使用该操作的结果作为函数的返回值.显然,返回类型必须(兼容)与为对象和对象完成的操作的返回类型匹配.argT2DoSomething()argT2
再次假设我们DoSomething()做了一些真正的操作,比如乘法.然后我们会DoSomething()像下面的代码一样编写:
template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> /* trailing return-type */ {
T2 t2Obj; // Or have it obtained in some other way
return arg * t2Obj;
}
Run Code Online (Sandbox Code Playgroud)
那么我应该如何为此形成尾随返回类型?
PS:我已尝试使用decltype(arg * T2),decltype(T1 * T2)以及decltype(T1::operator * (T2))其他一些看起来很奇怪decltype的尾随返回类型.他们都没有工作.
是否可以在Qt Creator中为编辑和调试模式设置不同的分割设置?
我是:
现在当我切换到调试模式时:
我可以告诉Qt Creator记住每次分裂吗?
(我在"选项"或"窗口"菜单中找不到此设置)