C++;如果结构包含互斥体,则将初始值设定项列表推送到标准向量上时出现问题 我现在正在研究C++中的一个项目,其中有一个结构清单,存储在一个向量中,这些向量有很多与它们相关的处理。为了加快速度,我选择了在多个线程之间拆分程序,而我选择的惰性方式是向标准库向量中的每个结构添加一个互斥体。通过这种方式,我可以让多个线程在数组中迭代,并通过调用mutex.try_lock(),或者完成与该元素相关的处理,或者移动到下一个打开的元素,基本上获得单个元素的所有权

C++;如果结构包含互斥体,则将初始值设定项列表推送到标准向量上时出现问题 我现在正在研究C++中的一个项目,其中有一个结构清单,存储在一个向量中,这些向量有很多与它们相关的处理。为了加快速度,我选择了在多个线程之间拆分程序,而我选择的惰性方式是向标准库向量中的每个结构添加一个互斥体。通过这种方式,我可以让多个线程在数组中迭代,并通过调用mutex.try_lock(),或者完成与该元素相关的处理,或者移动到下一个打开的元素,基本上获得单个元素的所有权,c++,mutex,clang++,initializer-list,deleted-functions,C++,Mutex,Clang++,Initializer List,Deleted Functions,在开始之前,请注意以下内容确实有效。 #include <mutex> #include <vector> struct foo { int a; std::mutex b; }; void working_demo () { // assign by initializer list foo f = {.a = 1}; } int main () { working_demo(); } #include <mutex

在开始之前,请注意以下内容确实有效。

#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void working_demo () {
    // assign by initializer list
    foo f = {.a = 1};
}

int main () {
    working_demo();
}
#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.push_back({.a = 1});
}

int main () {
    broken_demo();
}
#include <mutex>
#include <vector>

struct foo {
    foo (int A): a(A) {;}

    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.emplace_back(1);
}

int main () {
    broken_demo();
}
#包括
#包括
结构foo{
INTA;
std::互斥体b;
};
无效工作\u演示(){
//按初始值设定项列表分配
foo f={.a=1};
}
int main(){
工作演示();
}
因此,我打算以与上面非常类似的方式填充我的标准向量,但它不起作用。

#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void working_demo () {
    // assign by initializer list
    foo f = {.a = 1};
}

int main () {
    working_demo();
}
#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.push_back({.a = 1});
}

int main () {
    broken_demo();
}
#include <mutex>
#include <vector>

struct foo {
    foo (int A): a(A) {;}

    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.emplace_back(1);
}

int main () {
    broken_demo();
}
#包括
#包括
结构foo{
INTA;
std::互斥体b;
};
void breaked_demo(){
向量条;
//按初始值设定项列表分配
向后推压({.a=1});
}
int main(){
破碎的_demo();
}
编译器错误:

clang++ -std=c++11 -Wall -Wextra -Wfatal-errors -pedantic -I./  -c -o demo.o demo.cpp
demo.cpp:13:20: warning: designated initializers are a C99 feature [-Wc99-extensions]
    bar.push_back({.a = 1});
                   ^~~~~~
In file included from demo.cpp:1:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/mutex:38:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/tuple:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/array:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/stdexcept:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/string:41:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/allocator.h:46:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/x86_64-pc-linux-gnu/bits/c++allocator.h:33:
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/ext/new_allocator.h:146:8: fatal error: call to implicitly-deleted copy constructor of 'foo'
                            _Up(std::forward<_Args>(__args)...)))
                            ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/alloc_traits.h:483:24: note: in instantiation of exception specification for
      'construct<foo, foo>' requested here
        noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
                              ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:115:21: note: in instantiation of exception specification for 'construct<foo, foo>'
      requested here
            _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                           ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_vector.h:1201:9: note: in instantiation of function template specialization
      'std::vector<foo, std::allocator<foo> >::emplace_back<foo>' requested here
      { emplace_back(std::move(__x)); }
        ^
demo.cpp:13:9: note: in instantiation of member function 'std::vector<foo, std::allocator<foo> >::push_back' requested here
    bar.push_back({.a = 1});
        ^
demo.cpp:6:16: note: copy constructor of 'foo' is implicitly deleted because field 'b' has a deleted copy constructor
    std::mutex b;
               ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^

clang++ -std=c++11 -Wall -Wextra -Wfatal-errors -pedantic -I./  -c -o demo.o demo.cpp
In file included from demo.cpp:2:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/vector:65:
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_construct.h:75:38: fatal error: call to implicitly-deleted copy constructor of 'foo'
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
                                     ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:83:8: note: in instantiation of function template specialization
      'std::_Construct<foo, foo>' requested here
                std::_Construct(std::__addressof(*__cur), *__first);
                     ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:134:2: note: in instantiation of function template specialization
      'std::__uninitialized_copy<false>::__uninit_copy<std::move_iterator<foo *>, foo *>' requested here
        __uninit_copy(__first, __last, __result);
        ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:289:19: note: in instantiation of function template specialization
      'std::uninitialized_copy<std::move_iterator<foo *>, foo *>' requested here
    { return std::uninitialized_copy(__first, __last, __result); }
                  ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:310:19: note: in instantiation of function template specialization
      'std::__uninitialized_copy_a<std::move_iterator<foo *>, foo *, foo>' requested here
      return std::__uninitialized_copy_a
                  ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:473:10: note: in instantiation of function template specialization
      'std::__uninitialized_move_if_noexcept_a<foo *, foo *, std::allocator<foo> >' requested here
                = std::__uninitialized_move_if_noexcept_a
                       ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:121:4: note: in instantiation of function template specialization 'std::vector<foo,
      std::allocator<foo> >::_M_realloc_insert<int>' requested here
          _M_realloc_insert(end(), std::forward<_Args>(__args)...);
          ^
demo.cpp:15:9: note: in instantiation of function template specialization 'std::vector<foo, std::allocator<foo> >::emplace_back<int>' requested here
    bar.emplace_back(1);
        ^
demo.cpp:8:16: note: copy constructor of 'foo' is implicitly deleted because field 'b' has a deleted copy constructor
    std::mutex b;
               ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^
1 error generated.
clang++-std=c++11-Wall-Wextra-Wfatal errors-pedantic-I./-c-o demo.o demo.cpp
demo.cpp:13:20:警告:指定的初始值设定项是C99特性[-Wc99扩展名]
向后推压({.a=1});
^~~~~~
在demo.cpp中包含的文件中:1:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/mutex:38中包含的文件中:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/tuple:39中包含的文件中:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/array:39中包含的文件中:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/stdexcept:39中包含的文件中:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../../include/c++/9.1.0/string:41中包含的文件中:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/bits/allocator中包含的文件中。h:46:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/x86_64-pc-linux-gnu/bits/c++分配器中包含的文件中。h:33:
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/ext/new_allocator.h:146:8:致命错误:调用隐式删除的“foo”复制构造函数
_向上(标准::正向(_参数)…))
^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../include/c++/9.1.0/bits/alloc_traits.h:483:24:注意:在
此处请求“构造”
noexcept(noexcept(uu a.construct(u p,std::forward(u args)…))
^
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../../../include/c++/9.1.0/bits/vector.tcc:115:21:注:在“构造”异常规范的实例化中
在此请求
_Alloc_traits::construct(这个->\u M_impl,这个->\u M_impl.\u M_finish,
^
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/bits/stl_vector.h:1201:9:注意:在函数模板专门化的实例化中
此处请求“std::vector::emplace_back”
{emplace_back(std::move(__x));}
^
demo.cpp:13:9:注意:在成员函数“std::vector::push_back”的实例化中,此处请求
向后推压({.a=1});
^
demo.cpp:6:16:注意:“foo”的复制构造函数被隐式删除,因为字段“b”有一个已删除的复制构造函数
std::互斥体b;
^
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../../include/c++/9.1.0/bits/std_mutex.h:94:5:注意:此处已明确标记为“mutex”
互斥(const mutex&)=删除;
^
我很确定这是因为结构试图调用互斥体的复制构造函数,而互斥体实际上没有复制构造函数。我明确不想这样做

我最初的想法是,为了确保它甚至不尝试调用互斥体的复制构造函数,我可以为我的类创建自己的构造函数,基本上不必复制互斥体。这个方法看起来像这样-,但也不起作用。

#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void working_demo () {
    // assign by initializer list
    foo f = {.a = 1};
}

int main () {
    working_demo();
}
#include <mutex>
#include <vector>

struct foo {
    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.push_back({.a = 1});
}

int main () {
    broken_demo();
}
#include <mutex>
#include <vector>

struct foo {
    foo (int A): a(A) {;}

    int a;
    std::mutex b;
};

void broken_demo () {
    std::vector<foo> bar;

    // assign by initializer list
    bar.emplace_back(1);
}

int main () {
    broken_demo();
}
#包括
#包括
结构foo{
foo(inta):A(A){;}
INTA;
std::互斥体b;
};
void breaked_demo(){
向量条;
//按初始值设定项列表分配
吧台后安放(1);
}
int main(){
破碎的_demo();
}
编译器错误:

clang++ -std=c++11 -Wall -Wextra -Wfatal-errors -pedantic -I./  -c -o demo.o demo.cpp
demo.cpp:13:20: warning: designated initializers are a C99 feature [-Wc99-extensions]
    bar.push_back({.a = 1});
                   ^~~~~~
In file included from demo.cpp:1:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/mutex:38:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/tuple:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/array:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/stdexcept:39:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/string:41:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/allocator.h:46:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/x86_64-pc-linux-gnu/bits/c++allocator.h:33:
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/ext/new_allocator.h:146:8: fatal error: call to implicitly-deleted copy constructor of 'foo'
                            _Up(std::forward<_Args>(__args)...)))
                            ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/alloc_traits.h:483:24: note: in instantiation of exception specification for
      'construct<foo, foo>' requested here
        noexcept(noexcept(__a.construct(__p, std::forward<_Args>(__args)...)))
                              ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:115:21: note: in instantiation of exception specification for 'construct<foo, foo>'
      requested here
            _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                           ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_vector.h:1201:9: note: in instantiation of function template specialization
      'std::vector<foo, std::allocator<foo> >::emplace_back<foo>' requested here
      { emplace_back(std::move(__x)); }
        ^
demo.cpp:13:9: note: in instantiation of member function 'std::vector<foo, std::allocator<foo> >::push_back' requested here
    bar.push_back({.a = 1});
        ^
demo.cpp:6:16: note: copy constructor of 'foo' is implicitly deleted because field 'b' has a deleted copy constructor
    std::mutex b;
               ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^

clang++ -std=c++11 -Wall -Wextra -Wfatal-errors -pedantic -I./  -c -o demo.o demo.cpp
In file included from demo.cpp:2:
In file included from /usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/vector:65:
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_construct.h:75:38: fatal error: call to implicitly-deleted copy constructor of 'foo'
    { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
                                     ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:83:8: note: in instantiation of function template specialization
      'std::_Construct<foo, foo>' requested here
                std::_Construct(std::__addressof(*__cur), *__first);
                     ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:134:2: note: in instantiation of function template specialization
      'std::__uninitialized_copy<false>::__uninit_copy<std::move_iterator<foo *>, foo *>' requested here
        __uninit_copy(__first, __last, __result);
        ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:289:19: note: in instantiation of function template specialization
      'std::uninitialized_copy<std::move_iterator<foo *>, foo *>' requested here
    { return std::uninitialized_copy(__first, __last, __result); }
                  ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/stl_uninitialized.h:310:19: note: in instantiation of function template specialization
      'std::__uninitialized_copy_a<std::move_iterator<foo *>, foo *, foo>' requested here
      return std::__uninitialized_copy_a
                  ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:473:10: note: in instantiation of function template specialization
      'std::__uninitialized_move_if_noexcept_a<foo *, foo *, std::allocator<foo> >' requested here
                = std::__uninitialized_move_if_noexcept_a
                       ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/vector.tcc:121:4: note: in instantiation of function template specialization 'std::vector<foo,
      std::allocator<foo> >::_M_realloc_insert<int>' requested here
          _M_realloc_insert(end(), std::forward<_Args>(__args)...);
          ^
demo.cpp:15:9: note: in instantiation of function template specialization 'std::vector<foo, std::allocator<foo> >::emplace_back<int>' requested here
    bar.emplace_back(1);
        ^
demo.cpp:8:16: note: copy constructor of 'foo' is implicitly deleted because field 'b' has a deleted copy constructor
    std::mutex b;
               ^
/usr/sup/bin/../lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../include/c++/9.1.0/bits/std_mutex.h:94:5: note: 'mutex' has been explicitly marked deleted here
    mutex(const mutex&) = delete;
    ^
1 error generated.
clang++-std=c++11-Wall-Wextra-Wfatal errors-pedantic-I./-c-o demo.o demo.cpp
在demo.cpp中包含的文件中:2:
在/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../include/c++/9.1.0/vector:65中包含的文件中:
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../include/c++/9.1.0/bits/stl_construct.h:75:38:致命错误:调用隐式删除的“foo”复制构造函数
{::新建(静态_-cast(u-p))_-T1(标准::转发(u-args));}
^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../../../include/c++/9.1.0/bits/stl_未初始化。h:83:8:注意:在函数模板专门化的实例化中
此处请求了“std::u构造”
std::_构造(std:uuuu地址(*uuuu cur),*u优先);
^
/usr/sup/bin/./lib/gcc/x86_64-pc-linux-gnu/9.1.0/../../../../../../include/c++/9.1.0/bits/stl_uninitialized.h:134:2:注意:在函数模板专门化的实例化中
“std::\u未初始化\u副本::\u未初始化\u副本”已在此处请求