c++ - 对象 "is not a structure or union"如果临时传递给构造函数

标签 c++

我以前从未见过 C++ 的这种特殊之处,这让我有些困惑。

我有以下类(class):

class KeyValuesParser
{
public:
    explicit KeyValuesParser(const QByteArray &input);
    QJsonDocument toJsonDocument(QString* errorString = nullptr);

    // ...
};

我正尝试在 Qt 单元测试中像这样使用它:

const char* testData = "...";
KeyValuesParser parser(QByteArray(testData));
QJsonDocument doc = parser.toJsonDocument();

这会产生以下编译错误:

Member reference base type 'KeyValuesParser(QByteArray)' is not a structure or union.

但是,如果我在堆栈上创建字节数组然后将其传入,而不是传入临时数组,则一切都可以正常编译:

const char* testData = "...";
QByteArray testByteArray(testData)
KeyValuesParser parser(testByteArray);
QJsonDocument doc = parser.toJsonDocument();

我认为这可能是一些需要 explicit 关键字(这就是我添加它的原因)的奇怪黑魔法,但这没有任何区别。谁能解释一下这是怎么回事?

编辑:我被提到另一个问题是重复的,我认为它几乎是重复的,但在这个问题上有一些最令人烦恼的解析混淆,我认为值得额外讨论。

最佳答案

注意。这是乔纳斯在我附近的回答的补充。

你想做的是将右值绑定(bind)到左值引用,这在 C++ 标准中是不允许的。在您的第二个示例中 - 您通过引用正确传递了左值,这就是它起作用的原因。

将右值引用绑定(bind)到左值引用是Visual C++的扩展,g++根本做不到,clang用-fms-extensions可以做到

关于c++ - 对象 "is not a structure or union"如果临时传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905111/

相关文章:

c++ - 为什么不能在对象参数前面使用 const?

c++ - 在 Mac 上编译 C++ 代码

c++ - 来自 std::bind 的转换函数

c++ - 搜索数据集的高效算法

c++ - 使用 move_pages() 移动大页面?

c++ - 素数C++程序

c++ - 类型转换一个 const void*

c++ - 使用 OnComponentHit UE4 C++ 进行碰撞检测

c++ - 返回使用 boost.assign 初始化的匿名 tr1 数组

c++ - 在未命名的命名空间中定义的 C 回调函数?