据我所知,
begin(some_vector)
比some_vector.begin()
更标准,因为它支持数组...而且我也知道,使用using关键字
并不是一种理想的行为。然而,我还看到很多代码只包含这两个using
:using std::begin;
using std::end;
这是否被视为良好还是不良的实践?特别是需要许多begin
和end
时?
for
,最后的手段实际上是一个奇怪的查找,在其他地方不存在(它 仅 使用相关的命名空间,而不是作用域中的其他名称!)它不等同于using std::begin; auto b = begin(range);
因此当且仅当std
是关联命名空间时才会找到std::begin
(与 [swappable.requirements] 中指出的std::swap
是重载决议的候选项不同)。std::begin
不必成为候选项,因为std::begin(r)
仅在r.begin()
有效时才起作用,如果这样有效,则基于范围的for
的项目 (1.2) 将使用它。 - Jonathan Wakelyusing std::begin; using std::end;
,因为那会导致问题。 - Jonathan Wakelybegin()
和end()
成员,这些成员仅简单地转发到被适配的类的某些其他成员。因此,如果您有一个具有First()
和Last()
成员的类,则可以执行for(auto i:make_rangelike(c))
,其中该函数创建存储&c
的适配器类,其begin()
调用m_wrapped->First()
,其end()
调用m_wrapped->Last()
。这可能比通过添加自由函数来适应类更安全,以便ADL找到它们。 - Jonathan Wakelyusing std :: begin
这个东西,但从现在开始,我可能更喜欢不这样做。 - Ilya Popov