【发布时间】:2016-04-11 20:51:57
【问题描述】:
我有一些从我的 svn 存储库下载的 Qt 代码。我已经有一段时间没有研究它了,但我确信它曾经编译过。
我有一个新版本的 Qt 和编译器(与上次一样)。我目前的编译器是:mingw 4.9.2 32-bit。
这是我的问题代码:
QByteArray dataBlock = audioTestFile.read(PACKET_SIZE_TO_ENCODE);
// This line is the issue
uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(), dataBlock.end()));
地点:
typedef std::vector<uint8_t> uint8Vect_t;
和
uint8Vect_t encodeData(uint8Vect_t &dataBuff);
所以你可以在这里看到我有一个函数 encodeData() ,它接受一个参数 uint8Vect_t & (通过 ref 传递)。我正在传递一个使用来自QByteArray dataBlock 迭代器(我已经测试过)的std::vector 构造函数(其中一个需要两个迭代器)创建的临时变量(我认为是一个右值)。
但是,我得到了错误:
../audioTest/txaudiostream.cpp:在成员函数'void CTxAudioStream::playFile()': ../audioTest/txaudiostream.cpp:212:94: 错误:没有匹配的调用函数 'CTxAudioStream::encodeData(uint8Vect_t)' uint8Vect_t testVect = encodeData(uint8Vect_t(dataBlock.begin(), dataBlock.end())); ^ ../audioTest/txaudiostream.cpp:212:94:注意:候选人是: ../audioTest/txaudiostream.cpp:36:13:注意:uint8Vect_t CTxAudioStream::encodeData(uint8Vect_t&) uint8Vect_t CTxAudioStream::encodeData(uint8Vect_t &dataBuff) ^ ../audioTest/txaudiostream.cpp:36:13:注意:没有已知的参数 1 从 'uint8Vect_t {aka std::vector}' 到 'uint8Vect_t& {aka std::vector&}'的转换
基本上是说我无法从 uint8Vect_t 转换为 uint8Vect_t&。但是,如果我将 uint8Vect_t 类型的变量传递给函数(而不是构造函数/临时变量的返回值),那么这可以正常工作。
我认为在 c++11 中你可以传递右值。但我显然在这里遗漏了一些东西。谁能解释一下:
- 为什么这是错误的?
- 什么是高效/优雅(可读)的解决方案?
【问题讨论】:
-
你的旧编译器是什么? MSVS?
-
您不能通过非常量引用传递临时(右值)。根据您期望的语义(所有权、可变性等),按值传递或通过 const 引用传递。
-
@NathanOliver 很有可能是,我在处理大量不同的编译器...但我不能 100% 确定...会有区别吗? surly 它的语法是否正确? (不是迂腐,这是一个严肃的问题)
-
代码错误,所以它之前编译的事实告诉我们,之前的编译器很可能是 MSVC(它编译了错误代码的特定示例)。
-
@code_fodder 我在答案中添加了解释。
标签: c++ qt c++11 rvalue-reference