假设我有一个如下定义的类:
class foo{};
Run Code Online (Sandbox Code Playgroud)
现在,这是完全可以接受的;
foo f;
Run Code Online (Sandbox Code Playgroud)
怎么会出现编译错误?(uninitialized const ‘f’)
const foo f;
Run Code Online (Sandbox Code Playgroud)
我们为什么要这样做?
const foo f = foo();
Run Code Online (Sandbox Code Playgroud)
我知道为什么我们不能这样做..
const foo f(); // though it compiles..
Run Code Online (Sandbox Code Playgroud)
有趣的是,以下内容是有效的:
const std::string f;
Run Code Online (Sandbox Code Playgroud)
那么缺少foo什么?
我意识到那里有三个问题,这是一个糟糕的形式,但我希望有人可以在一个答案中为我解决这个问题.
编辑:如果它是愚蠢的,请随时关闭它...
很抱歉这个模糊的标题,但不确定如何表达它.所以我正在浏览boost :: asio的内部(试图追踪一些荒谬的延迟),我注意到这样的代码点缀着:
op_queue<operation> completed_ops;
task_cleanup c = { this, &lock, &completed_ops };
(void)c; // EH?
Run Code Online (Sandbox Code Playgroud)
现在从正在初始化的结构的名称,我猜它正在使用RAII在销毁上做一些步骤 - 很好,但是最后一行的目的是什么?我是否只是错过了一些完全时髦的东西?
我正在尝试确定是否存在构建具有调试符号的发布二进制文件的任何缺点.对于我们的发布版本,我们-O3目前正在编译,如果有任何崩溃,则核心旁边是无用的.
所以,我想要做的是修改构建以留在调试符号中,即-O3 -g,但是存在阻力,因为感觉可能会有一些影响(除了二进制的大小).我知道尺寸问题可以通过剥离符号来解决,但还有其他任何我想念的微妙问题吗?
我们在python中有一个代码库,它使用asyncio和协同例程(async方法和awaits),我想做的是从C++类中调用其中一个方法,这个类被拉入python(使用pybind11)
假设有这样的代码:
class Foo:
async def bar(a, b, c):
# some stuff
return c * a
Run Code Online (Sandbox Code Playgroud)
假设代码是从python中调用的,并且有一个io循环处理它,在某些时候,代码会进入bar需要调用此方法的C++领域- 如何await在C++中实现这一结果?
简单的问题,让我给出一些背景知识:
我有一个mpl::vector类型,其中每个类型都有一个id,在运行时我使用mpl::for_each迭代这个向量并找到给定id的匹配类型.但是一旦发现,继续循环是没有意义的,所以 - 问题是,有没有办法摆脱它(没有抛出异常)?
我们刚刚将编译器升级到gcc 4.6,现在我们得到了一些警告.目前我们的代码库还没有用c ++ 0x编译的状态,无论如何,我们不想在prod中运行它(至少还没有) - 所以我需要一个修复来删除这个警告.
警告通常是因为这样的事情发生:
struct SomeDataPage
{
// members
char vData[SOME_SIZE];
};
Run Code Online (Sandbox Code Playgroud)
之后,将按以下方式使用
SomeDataPage page;
new(page.vData) SomeType(); // non-trivial constructor
Run Code Online (Sandbox Code Playgroud)
例如,要读取,更新和返回,以下演员曾经发生过
reinterpret_cast<SomeType*>(page.vData)->some_member();
Run Code Online (Sandbox Code Playgroud)
4.4这是可以的; 在4.6中上面生成:
警告:类型惩罚指针将破坏严格别名规则
现在一个删除此错误的干净方法是使用a union,但是就像我说的,我们不能使用c ++ 0x(因此不受限制的联合),所以我使用了下面可怕的黑客 - 现在警告已经消失,但我可能会调用鼻守护进程吗?
static_cast<SomeType*>(reinterpret_cast<void*>(page.vData))->some_member();
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常(请参阅这里的简单示例:http://www.ideone.com/9p3MS)并且不会生成任何警告,这是否正常(不具有文体意义)使用此直到c ++ 0x?
注意:我-fno-strict-aliasing一般不想使用......
编辑:似乎我错了,同样的警告是在4.4,我想我们最近只选择了这个改变(它总是不太可能是一个编译器问题),问题仍然存在.
编辑:进一步调查产生了一些有趣的信息,似乎在一行中进行强制转换和调用成员函数是导致警告的原因,如果代码被分成两行,如下所示
SomeType* ptr = reinterpret_cast<SomeType*>(page.vData);
ptr->some_method();
Run Code Online (Sandbox Code Playgroud)
这实际上不会产生警告.结果,我在ideone上的简单示例是有缺陷的,更重要的是我的hack上面没有修复警告,修复它的唯一方法是从强制转换中分离函数调用 - 然后强制转换可以保留为reinterpret_cast.
不确定这是否可行而不必经过多次通过,但无论如何我都会问(我的XSL有点生锈)
我有一个XML文档,其中包含如下节点:
<structures>
<structure id="STRUCT_A">
<field idref="STRUCT_B" name="b"/>
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_D" name="d"/>
</structure>
<structure id="STRUCT_B">
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_E" name="e"/>
</structure>
<structure id="STRUCT_C">
<field idref="FIELD_E" name="e"/>
<field idref="FIELD_F" name="f"/>
<field idref="FIELD_G" name="g"/>
</structure>
</structures>
Run Code Online (Sandbox Code Playgroud)
(真正的文件包含许多相互依赖的结构标签,其中没有一个是圆形的!)
我想要做的是生成一些文本(在这种情况下是C++ struct),明显的要求是structs 的顺序,所以我的理想输出将是
struct STRUCT_C
{
FIELD_E e;
FIELD_F f;
FIELD_G g;
};
struct STRUCT_B
{
STRUCT_C c;
FIELD_E e;
};
struct STRUCT_A
{
STRUCT_B b;
STRUCT_C c;
FIELD_D d;
};
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用前向声明,这意味着顺序无关紧要,但问题是结构中会内嵌"处理"代码,并且它们需要存在真正的定义.
到目前为止,我可以structure通过以下xsl位来检测是否存在任何依赖关系:
<xsl:for-each select="descendant::*/@idref">
<xsl:variable name="name" …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
struct A{};
struct Base {
virtual A& internal() = 0;
};
struct Derives : public Base {
auto& internal() override { // <-- conflicting return type
return internal_;
}
private:
A internal_;
};
int main() {
Derives d;
auto& internal = d.internal();
}
Run Code Online (Sandbox Code Playgroud)
这无法编译(在coliru上测试 - 使用gcc),返回类型冲突 - 我的问题是为什么编译器不能推断出两者internal_(因此返回类型)A?是否在auto编译的不同阶段推断出类型,例如检查虚拟覆盖的类型?当然,如果你auto用正确的类型替换它会编译- 但这也是重点.
(这是铿锵错误,gcc有点类似)
main.cpp:8:11:错误:虚函数'internal'的返回类型与它覆盖的函数的返回类型不一致('auto&'不是从'A&'派生的)
Run Code Online (Sandbox Code Playgroud)auto& internal() override { // <-- conflicting return type ~~~~~ ^main.cpp:4:16:注意:重写的虚函数就在这里
Run Code Online (Sandbox Code Playgroud)virtual A& internal() = 0; ~~ ^生成1个错误.
当我不希望在某些情况下出现同步开销而在其他情况下需要真正的互斥时,我发现能够放入null_mutex(当前boost::interprocess::null_mutex)非常有用的功能.
我正在尝试使用新的c ++ 11 mutex类,但我看不到相应的null_mutex- 这让我感到困惑..
是的,我知道实施它是微不足道的(或者我可以继续使用增强,但在可能的情况下,我试图坚持标准,似乎是一个小小的遗漏?)
我想基于我传递给包含类的构造函数的标志触发成员变量的特定构造函数.
如果我从一个简单的例子开始,这是最简单的:
#include <boost/optional.hpp>
#include <boost/none.hpp>
#include <boost/utility/typed_in_place_factory.hpp>
struct state
{
bool flag1;
bool flag2;
int value;
};
class A
{
public:
A() : _a() {}
A(boost::none_t none) : _a() {}
A(state& st) : _a(st.value) {}
A(const A& copy) : _a(copy._a) {}
private:
boost::optional<int> _a;
};
class B
{
public:
B() : _b() {}
B(boost::none_t none) : _b() {}
B(state& st) : _b(st.value) {}
B(const B& copy) : _b(copy._b) {}
private:
boost::optional<int> _b;
};
class C
{
public:
C() : …Run Code Online (Sandbox Code Playgroud)