TBB编译器错误 - ' my_task':引用必须初始化

时间:2018-05-10 14:47:39

标签: c++ visual-studio visual-c++ c++17 tbb

我在项目的多个地方使用TBB。但似乎自从我将Visual Studio从15.6.X(X beeing最新版本)更新到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上的交叉问题。

2 个答案:

答案 0 :(得分:2)

只需删除/ permissive-(例如,在C / C ++选项中将“兼容模式”设置为“否”)即可解决此问题。我想英特尔会尽快解决这个问题。

答案 1 :(得分:1)

这是使用/permissive-选项时的编译器错误。可以使用以下代码进行复制:

struct U {
    template<typename T>
    void foo() {
        class A {
            int& iref;
        public:
            A(int& ir) : iref(ir) { }
        };
        int the_answer = 42;
        A a(the_answer);
    }
};

int main() {
    U u;
    u.foo<int>();
    return 0;
}

该代码是完全有效的,兼容C ++的代码。如您所见,引用是在构造函数的成员初始化器列表中显式初始化的。同样,这似乎是VS中的回归,因为至少VS 2017的初始版本(15.0.something)使用/permissive-编译了此代码。