我假设"i"是增量而"a"是指定的,但我无法弄清楚或找到答案.此外,它看起来非常类似于itoa
我认为令人困惑的非标准.
以下代码非常简单,我希望它应该编译好.
struct A
{
struct B
{
int i = 0;
};
B b;
A(const B& _b = B())
: b(_b)
{}
};
Run Code Online (Sandbox Code Playgroud)
我用g ++版本4.7.2,4.8.1,clang ++ 3.2和3.3测试了这段代码.除了g ++ 4.7.2对此代码的段错误(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57770)之外,其他经过测试的编译器提供的错误消息并不能解释太多.
g ++ 4.8.1:
test.cpp: In constructor ‘constexpr A::B::B()’:
test.cpp:3:12: error: constructor required before non-static data member for ‘A::B::i’ has been parsed
struct B
^
test.cpp: At global scope:
test.cpp:11:23: note: synthesized method ‘constexpr A::B::B()’ first required here
A(const B& _b = B())
^
Run Code Online (Sandbox Code Playgroud)
clang ++ 3.2和3.3:
test.cpp:11:21: error: defaulted …
Run Code Online (Sandbox Code Playgroud) 正如这个问题所示,使用g ++,我能做到g++ -S -masm=intel test.cpp
.另外,对于clang,我可以这样做clang++ -S test.cpp
,但-masm=intel
clang(warning argument unused during compilation: -masm=intel
)不支持.如何使用clang获取intel语法?
在C++中,您可以使用初始化列表在构造函数开始运行之前初始化类的字段.例如:
Foo::Foo(string s, double d, int n) : name(s), weight(d), age(n) {
// Empty; already handled!
}
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么Java没有类似的功能.根据Core Java:第1卷:
C++使用这种特殊语法来调用字段构造函数.在Java中,不需要它,因为对象没有子对象,只有指向其他对象的指针.
这是我的问题:
它们是什么意思"因为对象没有子对象?" 我不明白子对象是什么(我试着查找它); 它们是指扩展超类的子类的实例化吗?
至于为什么Java没有像C++这样的初始化列表,我认为原因是因为所有字段在Java中都已默认初始化,并且因为Java使用super
关键字来调用super(或C++语言中的基础) - 类构造函数.它是否正确?
在一个系统头文件中,我看到如下表达式:
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}
Run Code Online (Sandbox Code Playgroud)
我不知道" - >"是什么意思,它不是指针表达式或lambda表达式,任何人都可以帮助我吗?
我正在阅读"C++ Cookbook",其中包含以下代码段:
// cout << s << std::endl; // You shouldn't be able to
wcout << ws << std::endl; // run these at the same time
Run Code Online (Sandbox Code Playgroud)
如果您对查看实际示例感兴趣,可以在此处找到Google图书页面的链接.
此外,我发现这个SO问题似乎表明混合wcout和cout是可以的.有人可以向我解释一下这个评论的内容吗?
编辑
从C++标准[27.4.1]:
对相应的宽字符和窄字符流的混合操作遵循与在FILE上混合此类操作相同的语义,如ISO C标准的修订1中所规定的.
从C标准[7.19.2]:
每个流都有一个方向.在流与外部文件关联之后,但在对其执行任何操作之前,该流没有方向.一旦将宽字符输入/输出功能应用于没有方向的流,该流就变为面向广泛的流.类似地,一旦将字节输入/输出功能应用于没有方向的流,该流就变成面向字节的流.只有调用freopen函数或fwide函数才能改变流的方向.(成功拨打freopen会删除任何方向.)
字节输入/输出功能不应用于面向广泛的流,宽字符输入/输出功能不应用于面向字节的流.
所以,标准似乎说你不应该混合它们.但是,我从这篇文章中找到了这句话:
对于Visual C++ 10.0,fwide函数被记录为未实现.从实际的角度来看,至少在输出整行的水平上,它显然可以很好地混合使用cout和wcout.因此,很高兴,Visual C++显然只是忽视了标准的要求,并没有维护一个不切实际的显式C FILE流方向.
而且,关于gcc,我从这里找到了这个引用:
这是一个(新的)功能,而不是一个bug,请参阅libstdc ++/11705,以及在C标准(C99,7.19)中的流方向搜索.简而言之,您不能混合面向字节和面向广泛的I/O. 目前,由于 libstdc ++/11705中指出的bug,你可以通过调用std :: ios :: sync_with_stdio(false)获得接近你期望的东西.在你的程序的开头.
在过去,你可能有这样的功能:
const char* find_response(const char* const id) const;
Run Code Online (Sandbox Code Playgroud)
如果找不到该项,则可以返回null以指示该事实,否则显然返回相关的字符串.
但是当函数改为:
const std::string& find_response(const std::string& id) const;
Run Code Online (Sandbox Code Playgroud)
您返回什么表示未找到项目?
或者签名真的应该是:
bool find_response(const std::string& id, std::string& value) const;
Run Code Online (Sandbox Code Playgroud)
什么是最优雅的现代C++方式?
示例(编译好)
struct A
{
void f() {};
auto g() -> decltype(f())
{}
};
Run Code Online (Sandbox Code Playgroud)
题
如果我this
在decltype(ie decltype(this->f())
)中添加指针,我会用gcc 4.7.0获得以下编译错误:
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
error: invalid use of incomplete type 'struct A'
error: forward declaration of 'struct A'
Run Code Online (Sandbox Code Playgroud)
是否this
允许在decltype中使用?有人能帮我理解是什么问题吗?
编辑