问题标签 [c++17]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
545 浏览

c++ - 转发成员函数的 cv-ref-qualifier

如果(成员)函数模板没有其他重载(例如,f(T &)或) ,那么就是所谓的转发引用,并且是,或者对于某些cv 限定类型。但是对于成员函数的cv-ref-qualifiers没有这样的规则。在一个总是右值引用限定符中。f(volatile T &&)template< typename T > f(T &&);T &&TUU &Ustruct S { void f() && { ; } };S::f()

volatile在泛型代码中,避免定义某些成员函数的 4 个(甚至 8 个,如果我们还考虑限定符)重载是非常有用的,以防它们都做同样的事情。

以这种方式出现的另一个问题是,在特定意义上定义有效的cv-ref-qualifier是不可能的。*this以下代码不允许确定成员函数的引用限定符operator ()是否&&&.

但如果有上述语法,那就太好了。即decltype((*this))表示精确的cv-ref-qualified类型*this。在我看来,将这样的语法引入到即将到来的C++标准版本中并不是一个重大改变。但是&&作为转发 cv-ref-qualifier是(而且它看起来像是委员会的遗漏(即核心语言工作组))。

另一个序列可以在其主体中表示成员函数cv-ref-qualifiercv-ref-qualified类型:等。*thisauto &&decltype(&&)

是否有关于此问题的提案,准备在C++17中使用?

0 投票
3 回答
4012 浏览

c++ - 哨兵和结束迭代器有什么区别?

在阅读 Eric Niebler 的范围提案时,
我遇到了哨兵一词作为结束迭代器的替代品。
我很难理解哨兵相对于结束迭代器的好处。
有人可以提供一个清晰的例子来说明哨兵带来的标准迭代器对无法完成的事情吗?

哨兵是结束迭代器的抽象。哨兵是常规类型,可用于表示范围的结束。哨兵和表示范围的迭代器应为 EqualityComparable。哨兵表示一个元素,当迭代器 i 比较等于哨兵,并且 i 指向那个元素。” -- N4382

我认为哨兵作为确定范围结束的功能,而不仅仅是位置?

0 投票
1 回答
621 浏览

c++ - 可变参数聚合作为核心语言特征

std::tuple是高度模板加载的野兽。要访问第 n 个成员,编译器必须执行大量模板实例化,尽管它的性质很简单:访问相应虚构结构的第 n 个数据成员。似乎这std::tuple应该是一个核心语言功能,像这样(伪代码):

是否有类似语言支持的可变参数数据成员定义语法之类的建议?

0 投票
2 回答
1853 浏览

c++ - 构造函数有条件地标记为显式

更新: 条件显式已进入 C++20 草案。更多关于 cppreference

cppreference std::tuple 构造函数页面有一堆 C++17 注释,内容如下:

此构造函数是explicit当且仅当std::is_convertible<const Ti&, Ti>::value对于至少一个为假i

如何编写一个有条件显式的构造函数?想到的第一个可能性是explicit(true)但这不是合法的语法。

尝试enable_if失败:

出现错误:

0 投票
1 回答
982 浏览

c++ - 为什么 C++17 中 std::function 的 operator() 会发生变化?

以下代码在 C++14 中被认为是非法的,但在 C++17 中是合法的:

不要费心去测试它,你会得到不一致的结果,很难判断它是错误还是故意行为。然而,比较两个草稿(N4140 与 N4527,两者都可以在 github.com/cplusplus/draft 上找到),[func.wrap.func.inv] 有一个显着差异。第 2 段:

返回: 如果 R 为 void,则返回任何内容,否则返回 INVOKE (f, std::forward(args)..., R) 的值。

以上内容在草稿之间被删除。这意味着 lambda 的返回值现在被默默地丢弃。这似乎是一个错误的特征。任何人都可以解释其中的原因吗?

0 投票
3 回答
4423 浏览

c++ - std::string 是否需要将其字符存储在连续的内存中?

我知道在 C++98 中,既不需要std::basic_string<>也不std::vector<>需要使用连续存储。std::vector<>一旦被指出,这被视为疏忽,而且,如果我没记错的话,用 C++03 修复了。

似乎记得在 C++11 仍被称为 C++0x 时,我曾读过关于需要std::basic_string<>使用连续存储的讨论,但当时我并没有密切关注讨论,并且在工作中仍然仅限于 C++03 ,所以我不确定它是怎么回事。

那么std::basic_string<>需要使用连续存储吗?(如果是这样,那么哪个版本的标准首先需要它?)

如果您想知道:如果您有代码将结果传递&str[0]给期望写入连续内存的函数,这一点很重要。(我知道str.data(),但由于明显的原因旧代码不使用它。)

0 投票
6 回答
78808 浏览

c++ - 实验性::文件系统链接器错误

我尝试在 gcc 6.0 的开发中使用新的 c++1z 特性。

如果我尝试这个小例子:

我有:

gcc 版本是快照 linux-gnu_6-20151011

任何提示如何链接新的 c++1z 功能?

0 投票
5 回答
2511 浏览

c++ - 根据转换后的值查找最小元素

这是来自代码审查的任务。我想根据一种特殊的比较谓词从一组中选择一个最小值。像这样:

在这里,我找到了基于谓词的最小元素。这个谓词计算两个值的减少float,然后比较这些浮点数。工作正常,看起来很整洁。

你能看出问题吗?是的,一组N元素calcReduction()被称为2N时间,而只计算N一次就足够了——每个元素一次。

解决此问题的一种方法是编写显式计算:

它工作正常,我们只有N调用calcReduction(). 但是,与显式调用min_element. 因为当你打电话min_element时很容易猜到你会找到一个最小元素,你知道的。

我现在唯一的想法是创建自己的算法min_element_with_reduction,例如接受范围和归约函数。听起来很合理,但我想知道是否有现成的解决方案。

关于如何以明确的意图和一些现成的解决方案解决此任务的任何想法?欢迎提升。C++17 和范围很有趣。

0 投票
1 回答
353 浏览

c++ - 在概念中使用带有 CRTP 的模板模板参数

我想写一个concept测试从基类继承的东西。

我的类使用 CRTPBase由类公开继承。Derived

此代码工作正常:

如果我想模板化,我遇到了问题Derived。这可能吗?

明显的问题是T我的concept声明中没有。此外,我很确定我不能声明

因为 aconcept需要一个模板参数。

编辑-工作文件 P0121R0第 8.3.5 节第23 页中列出,template<typename T, typename U> concept bool C3 = true;. 因此,无论我在哪里阅读 a conceptcan take only 一个参数,要么是过时的、错误的,要么是我阅读时不小心。结束编辑

我可以在这里访问T我需要的其他类型吗?有没有另一种方法(在我看来,模板类型D会携带它的类型的信息T,但我也不能使用using T = typename D<T>::valueType;,因为我需要T具体的类型D<T>......)

0 投票
3 回答
1138 浏览

c++ - C++ 是否有一个自由函数`size(object)`?

似乎大多数人找到 a 大小的方式string是他们只使用 themy_string.size()并且它工作正常。好吧,我最近在我做过的课程上做了一个作业......

代替....

但令我惊讶的是,我认为正在运行旧编译器的讲师无法运行那行代码。在我的编译器上它可以双向工作,我不太清楚为什么。

一个完整的程序(两者都输出 4):

如果有人能解释为什么我的问题解决方案适用于我的机器而不是我的教授?另外,我目前正在运行 VS2015。