从range-v3的文档中:
view::all
返回包含源中所有元素的范围.用于将容器转换为范围.
让我困惑的是:
view::all
使用?std::vector
,std::list
等)在概念上不是范围吗?例如:
auto coll = std::vector{ 1, 2, 2, 3 };
view::all(coll) | view::unique; // version 1
coll | view::unique; // version 2
Run Code Online (Sandbox Code Playgroud)
有什么区别version 1
和version 2
?
struct A
{
template<int>
void foo()
{}
};
int main()
{
A a;
a.foo<0>(); // ok
a.template foo<0>(); // also ok
}
Run Code Online (Sandbox Code Playgroud)
显然,比起来a.foo<0>();
更简洁,直观和富有表现力a.template foo<0>();
.
为什么C++允许a.template foo<0>();
即使a.foo<0>();
足够了?
在cppref,我找到一个奇怪的C++代码,它在源代码中使用非ascii字符,如下所示:
template <char...> double operator "" _?(); // OK
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码不能用clang 6.0进行编译.错误消息是:
error : source file is not valid UTF-8
1>double operator "" _<A6><D0>()
1> ^
Run Code Online (Sandbox Code Playgroud)
我的问题是:
_?
没有参数,那么,如何使用_?
?刚用double var = _?;
?在阅读Microsoft's implementation of Cpp Core Guidelines 时,我遇到了两个问题:
gsl::string_span
在gsl::span
已经运行良好的地方提供?gsl::zstring_span
在std::string
自 C++11 以来已保证以空值终止的地方提供?任何说明情况都将受到高度赞赏。