【发布时间】:2018-05-10 14:47:38
【问题描述】:
我在项目的多个地方使用 TBB。但似乎自从我将 Visual Studio 从 15.6.X(X 是最新版本)更新到 15.7.1 后,我在几个地方遇到了编译器错误,告诉我
[...]tbb\task_group.h(94): 错误 C2530: 'my_task': 必须初始化引用
查看引用的代码(tbb/task_group.h):
//! Base class for types that should not be assigned.
class no_assign {
// Deny assignment
void operator=( const no_assign& );
public:
#if __GNUC__
//! Explicitly define default construction, because otherwise gcc issues gratuitous warning.
no_assign() {}
#endif /* __GNUC__ */
};
//! Base class for types that should not be copied or assigned.
class no_copy: no_assign {
//! Deny copy construction
no_copy( const no_copy& );
public:
//! Allow default construction
no_copy() {}
};
// ...
class ref_count_guard : internal::no_copy {
task& my_task; // compiler error occurs here
public:
ref_count_guard( task& t ) : my_task(t) {
my_task.increment_ref_count();
}
~ref_count_guard() {
my_task.decrement_ref_count();
}
};
我不明白为什么编译器在那里抱怨,因为引用是由构造函数初始化的。在我的代码中找到问题也不是那么容易,因为编译器错误发生在每个使用 TBB 的源文件中,而且我认为自上次成功编译以来我没有更改任何内容(除了更新 VS)。
我想到的一种可能性与this question 有关。如果默认情况下 msvc 以某种方式继承了基类构造函数,则会继承默认构造函数来解释错误。但是testing 这种情况似乎反驳了它(代码编译时)。
为什么 msvc 在这里抱怨?
更新
这个最小的例子重现了我系统上的错误:
#include <vector>
#include <tbb/tbb.h>
#include <tbb/flow_graph.h>
void main()
{
std::vector<int> src{1, 2, 3, 4, 5};
tbb::parallel_for_each(src.begin(), src.end(), [](int) { });
}
更新 2
看起来只是包含tbb/tbb.h 会导致错误发生。我什至不需要打电话。用新的编译器版本重建 tbb 也没有帮助。
编辑
github 上的交叉问题。
【问题讨论】:
-
"
// Deny assignment void operator=( const no_assign& );" 由void operator(const no_assign&) = delete;更好/更明确地完成,您甚至根本不需要no_assign类。只是= delete类中不应赋值的赋值运算符,而不是从no_assign继承。更少的代码,更明确的;赢了,赢了。 -
@JesperJuhl 那是 TBB 内部代码。那不是我写的。我知道
= delete是更好的选择... -
"` 显式定义默认构造` ..." - 只需使用
= default那么默认构造函数也将是微不足道的,而不是用户定义的(如果可能的话,这是可取的)。 -
@JesperJuhl 再次强调:上面显示的代码不是我的代码。它来自 TBB 头文件。
-
@ntfs.hard 是的,这个问题是我打开的。我在此处和 github 上添加了链接。
标签: c++ visual-studio visual-c++ c++17 tbb