关于为什么我不能初始化对象数组(如果它们有私有拷贝构造函数)的现有问题?特指C++ 03.我从那个问题中知道我在C++ 03中不允许做什么,但我认为它应该可以在C++ 11中实现
我有一个不可移动的类(称之为Child),我需要在另一个类的构造函数中初始化一个Child数组(称之为Parent)."不可移动"是指在该对象的生命周期内,Child对象的地址必须保持不变.这样做的正确方法是什么?
使用C++ 11,我尝试了以下内容:
class Child
{
public:
Child (int x) {}
~Child () {}
Child (const Child &) = delete;
};
class Parent
{
public:
Parent () : children {{5}, {7}} {}
private:
Child children[2];
};
Run Code Online (Sandbox Code Playgroud)
此代码与Clang 3.5.0编译良好,但GCC 4.9.1抱怨我正在尝试使用已删除的复制构造函数:
test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
Parent () : children {{5}, {7}} {}
^
test.cc:7:5: note: declared here
Child (const Child &) = delete;
^
Run Code Online (Sandbox Code Playgroud)
我已经读过复制初始化和直接初始化之间的区别(例如这里 …
我有以下C++ 11代码(简化版):
struct Info
{
const char * name;
int version;
};
class Base
{
public:
const Info info;
Base (Info info) : info (info) {}
};
class Derived : public Base
{
public:
static constexpr Info info = {"Foobar", 2};
Derived () : Base (info) {}
};
int main ()
{
static Derived derived;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC 4.9.1编译并链接此代码.另一方面,Clang 3.5.0抱怨未定义的引用:
/tmp/test-109c5c.o: In function `main':
test.cc:(.text+0x1c): undefined reference to `Derived::info'
test.cc:(.text+0x22): undefined reference to `Derived::info'
clang: error: linker command failed …Run Code Online (Sandbox Code Playgroud) 从实际应用程序中减少的以下测试用例无法链接-fsanitize=undefined(使用GCC 6.1.1),但没有它就链接正常.谁能告诉我为什么?
它似乎有事情做了Qt/QObject的,组合-fvisibility=hidden,和-fsanitize=undefined,但究竟问题出在哪里我是无法理解.
lib1.h:
#include <QObject>
class MyObject : public QObject
{
public:
MyObject (QObject * parent = nullptr);
~MyObject ();
void myMethod ();
};
Run Code Online (Sandbox Code Playgroud)
lib1.cc:
#include "lib1.h"
#define EXPORT __attribute__((visibility("default")))
EXPORT MyObject::MyObject (QObject * parent) : QObject (parent)
{
}
EXPORT MyObject::~MyObject ()
{
}
EXPORT void MyObject::myMethod ()
{
}
Run Code Online (Sandbox Code Playgroud)
lib2.cc:
#include "lib1.h"
void test (MyObject * object)
{
object->myMethod ();
}
Run Code Online (Sandbox Code Playgroud)
构建步骤:
LIBFLAGS="-fPIC -shared -Wall -Wl,-z,defs"
QTFLAGS="-I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core"
g++ -fsanitize=undefined …Run Code Online (Sandbox Code Playgroud)