码:
#include <memory>
struct Data;
std::unique_ptr<Data> make_me();
int main()
{
std::unique_ptr<Data> m = make_me();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然失败了:
In file included from <source>:1:
In file included from /opt/compiler-explorer/gcc-7.1.0/lib/gcc/x86_64-linux-gnu/7.1.0/../../../../include/c++/7.1.0/memory:80:
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/unique_ptr.h:76:16: error: invalid application of 'sizeof' to an incomplete type 'Data'
static_assert(sizeof(_Tp)>0,
^~~~~~~~~~~
/opt/compiler-explorer/gcc-7.1.0/include/c++/7.1.0/bits/unique_ptr.h:268:4: note: in instantiation of member function 'std::default_delete<Data>::operator()' requested here
get_deleter()(__ptr);
^
8 : <source>:8:31: note: in instantiation of member function 'std::unique_ptr<Data, std::default_delete<Data> >::~unique_ptr' requested here
std::unique_ptr<Data> m = make_me();
^
3 : <source>:3:8: note: forward declaration of 'Data' …Run Code Online (Sandbox Code Playgroud) 在C++中引入了17个并行std算法(使用ExecutionPolicy参数重载),其中定义了严格的执行顺序,交错和并行化规则,例如([algorithm.parallel.exec/3]):
使用类型为execute :: sequenced_policy的执行策略对象调用的并行算法中的元素访问函数的调用都发生在执行的调用线程中.[注意:调用不是交错的; 见4.6. - 结束说明]
(目前草案中的情况相同)
问题是我找不到这些算法的旧的非并行重载的任何这样的要求.
问:这是否意味着库实现者可以在引入执行术语线程时使用C++ 11,使用SIMD /多线程/其他(?)实现std :: transform和std :: generate?这有什么理由吗?
我正在检查使用旧的已弃用的代码,std::auto_ptr我想知道这是否是一个未定义的行为:
std::vector<std::auto_ptr<int>> v;
//populate v with elements...
std::sort(v.begin(), v.end(), [](auto a, auto b) {/* some reasonable "less" comparison */});
Run Code Online (Sandbox Code Playgroud)
现在,这种比较器当然会清空集合,因为复制构造函数std::auto_ptr采用非const引用.我正在寻找一个标准的规则,要求这样的行为,但我能找到的就是:
[alg.sorting#2] Compare是一个函数对象类型.当上下文转换为bool时,应用于Compare类型的对象的函数调用操作的返回值,如果调用的第一个参数小于第二个参数,则返回true,否则返回false.比较comp用于假设有序关系的算法. 假设comp不会通过解引用的迭代器应用任何非常量函数.
但这至少是不够的,因为比较器按值获取两个std :: auto_ptr并不"通过解除引用的迭代器应用任何非常量函数" - 比较器本身不应用复制构造函数.此外,同样的问题也适用Compare于[algorithms.requirements#7]段中的超类,关于BinaryPredicate我们几乎可以阅读相同的句子:
binary_pred不应通过解除引用的迭代器应用任何非常量函数.
这意味着,如果存在问题,将会传播到许多其他算法.
我的问题是:比较器,std::auto_ptr按值接受参数,违反了std::sort调用它的未定义行为的要求,或者这个代码很好,只是工作错误; )?或者,这可能是C++标准库规范中的一个问题?
阅读更多: