如何使用新的C++17执行策略?

21
我正在阅读std::algorithm文档,该文档在cppreference.com上发布,并注意到许多我尚未使用的很酷的东西都有C++17标签。其中引起我最大兴趣的是新的执行策略。从阅读中了解到,只需指定执行策略,就可以使任何for_each循环变成多线程。

例如,我有一个程序,它输出一个带有2D图形的图像。
int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

如果我想让这个程序支持多线程,只需要一行代码即可实现。
int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

然而,当我第一次尝试这样做(使用g++ -std=c++17)时,我收到了一个错误,告诉我‘std::execution’ has not been declared,所以我尝试添加#include <execution>,但是它显示execution: No such file or directory。我也尝试过使用#include<experimental/algorithm>代替#include<algorithm>,但结果相同。我该如何使用这个新功能?

3
请确认您的g++编译器支持此功能。C++17甚至还未正式发布,很可能还要再等几个月。 - chris
2
libstdc++目前还不支持此功能,可以查看P0024R2的状态为“否”:https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#iso.2017.specific - user784668
@underscore_d 关于重复关闭原因的帮助文本大致如下:“这个问题已经在……中得到了回答。”它并不一定要求问题完全相同。您应该先回答旧问题,然后再将此问题标记为重复。 - YSC
(这只是一个非特定的想法;在这里我同意它是重复的) - YSC
4个回答

15

尚未最终确定。各种编译器也没有完全实现它。

-std=c++17意味着“给我你已经完成的所有C++17内容”,而不是“成为一个完全有效的C++17编译器”。

你的编译器和/或标准库目前不支持这个特性。请在几周/几个月/几年后再来检查。

目前还没有普遍接受的“如果你完全支持C++17,请给我C++17,否则报错”的标志,因为它在实际上用处不大。如果他们提供的C++17子集足够使用,那就可以了。如果你需要一个完全兼容的编译器,具体版本的编译器不知道是否有错误,所以你不能信任该标志,并且必须针对编译器版本进行测试。如果你已经知道哪些编译器版本拥有足够有效的C++17,那么你不需要一个告诉你的标志。


4
有没有任何最新版本的编译器支持它?我在trunk上尝试了clang和gcc7。 - Zitrax
1
-std=c++17 的意思是“给我所有已经完成的C++17”而不是“成为一个完全有效的C++17编译器”。我以为这就是 -std=c++1z 的作用? 我错过了什么吗? - Cássio Renan
2
@cassio 1z是在C++17完成之前使用的;它可能完全实现标准中发生变化或被删除的内容等。17是标准完成的时间,但您的支持可能不完整。换句话说,MSVC刚刚在他们的最新补丁中完成了对C++11的支持(忽略错误)。 - Yakk - Adam Nevraumont

4
据我所知,根据cppreference,这个特性在P0024R2文档中定义,目前还没有任何编译器支持此特性。

1
现在怎么样? - lmat - Reinstate Monica

2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接