Ошибка компилятора TBB - «my_task»: ссылки должны быть инициализированы - PullRequest
0 голосов
/ 10 мая 2018

Я использую 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).

Одна возможность, которая приходит мне в голову, связана с этим вопросом .Если msvc каким-то образом наследует конструкторы базового класса по умолчанию, конструктор по умолчанию наследуется, объясняя ошибку.Но тестирование этот сценарий, кажется, опровергает его (при компиляции кода).

Почему 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 голосов
/ 21 июня 2018

Это ошибка компилятора, когда используется опция /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-.

0 голосов
/ 19 июня 2018

Простое удаление / permissive- (например, установите Comformance Mode на No в опциях C / C ++) обходит эту проблему.Я предполагаю, что Intel исправит это в ближайшее время.

...