GCC从哪个版本开始支持C++14?

8

我正在调查为什么这段代码在我的PC上编译通过,但在我们工具链的GCC v5.4上无法编译,尽管传递了-std=c++14 -Wpedantic -pedantic-errors

#include <array>
#include <vector>
#include <tuple>
typedef std::tuple<const char *, const char *, bool> StrStrBool;

const std::vector<StrStrBool> cApIDValidTestValues {
{
    {"str1", "str2", true },
    { "str3", "str4",  false }
}
};

错误信息如下: :12:1: 错误:使用初始化列表将转换为“std::tuple”会使用显式构造函数“constexpr std::tuple<>::tuple(_UElements&& ...) [with _UElements = {const char (&)[5], const char (&)[5], bool}; = void; _Elements = {const char*, const char*, bool}]” }; ^
这段代码是符合C++14标准的(解释),因此根据GCC的标准支持页面——该页面显示从GCC v5开始完全支持C++14——我期望GCC v5.4能够编译它。
但是有人在网上告诉我,看起来这个GCC版本的编译器支持C++14,但随附的libstdc++不符合C++14标准。
我的相关问题是:
  1. 提供符合C++14标准的libstdc++的最早GCC版本是什么?我如何找到其他标准的信息?
  2. 为什么GCC会宣传其具有某个版本的C++14支持,但随附的libstdc++却没有?
  3. 这是否表明gcc编译器可以与其他stdlib实现一起使用?

4
(1) Wandbox拥有多个GCC版本,你可以尝试二分查找。 (2) 人会犯错,在GPL下他们并不真正承担责任。 - StoryTeller - Unslander Monica
1
https://gcc.gnu.org/projects/cxx-status.html - msc
@rsp - 那个链接就在帖子中... - StoryTeller - Unslander Monica
1
@DBedrenko - 我认为这个问题没有银弹。你将不得不选择一个GCC版本并希望一切顺利。如果你的工具链不能经常更改,那么你将不得不在某个时候使用解决方法进行编程。 - StoryTeller - Unslander Monica
那么,你为什么考虑更新呢? - n. m.
显示剩余3条评论
1个回答

7

这段代码是C++14有效的(解释),

不是的(那个“解释”完全无关)。

因此,根据GCC的标准支持页面--自GCC v5以来显示完全支持C++14

该页面清楚地说明:“有关库实现状态的信息,请参阅this page。” 然而...

--我期望GCC v5.4能够编译它。

不行,因为5.4版本不支持C++17,并且特别不支持在C++14发布后添加到草案C++标准中的"Improving pair and tuple"功能。该功能已于2015年5月的C++委员会会议上获得批准,而GCC 5.1于2015年4月发布,该功能的更改对于稳定版本的GCC来说太过深入,无法进行回溯。库支持页面显示,从GCC 6.1开始支持libstdc++。

2
谢谢您的回答!我学到了很多!但是,如果我使用了C++17的功能,为什么v6.1编译器没有告诉我,即使我使用了-std=c++14 -pedantic-errors -pedantic进行编译?我要求它针对特定标准进行编译。 - DBedrenko
3
因为N4387提案的更改修复了早期标准(LWG 2051)中的缺陷,所以libstdc++无条件实现了这个修复,适用于所有标准模式。关键是这个修复发生在C++14发布和GCC 5发布后。要让这个更改受GCC 5支持,要么需要时间旅行,要么需要将非常影响稳定版本分支的更改进行回溯。 - Jonathan Wakely

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