纵观示例实现的std::is_array,它们具有以下代码:
template<class T>
struct is_array<T[]> : std::true_type {};
template<class T, std::size_t N>
struct is_array<T[N]> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
当将T[]专业化相匹配,而不是T[N]专业化?为什么需要两个?我假设这T[]与函数参数中的不一样,它表示与指针相同的东西吗?
我最近很恼火地发现在大海捞针中找不到针头时会string::find返回string::npos.这使得以下看似优雅的代码编译但抛出超出范围的异常:
s.erase(s.find('#')); // erase everything after a # if one exists
Run Code Online (Sandbox Code Playgroud)
如果失败后find返回s.length(),它将正常工作.相反,你必须这样做
auto pos = s.find('#');
if (pos != s.npos)
s.erase(pos);
Run Code Online (Sandbox Code Playgroud)
std::find如果找不到该项,这也与返回结束迭代器不一致.
我知道标准人都非常聪明,所以我相信他们并不是偶然想出来的.它必须在其他地方给我一些优雅,我没有看到.这有什么好理由?
我想使用基于范围for来迭代UTF8编码的unicode代码点std::string.我定义我自己begin,并end在全局命名空间,但begin和end在std命名空间中被优先(即那些由ADL找到).有什么方法可以选择我自己的功能吗?
例:
const char* begin(const std::string& s) {
std::cout << "BEGIN";
return s.data();
}
const char* end(const std::string& s) {
std::cout << "END";
return s.data() + s.length();
}
int main() {
std::string s = "asdf";
for (char c : s)
std::cout << c;
}
Run Code Online (Sandbox Code Playgroud)
我希望它打印BEGINENDasdf(或ENDBEGINasdf)但它打印asdf.
除了for使用合格的名称做手册之外别无他法吗?
为什么这段代码不能编译?
#include <sstream>
void f(std::stringstream) { }
int main() {
f(std::stringstream{});
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error: use of deleted function ‘std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)’
f(std::stringstream{});
^
Run Code Online (Sandbox Code Playgroud)
如果我std::stringstream用另一种不可复制的类型替换它可以正常工作.不应该使用stringstream移动构造函数吗?
我没有支持的所需PHP版本finally,所以我想知道是否:
try {
work();
} catch (Exception $e) {
cleanup();
throw $e;
}
cleanup();
Run Code Online (Sandbox Code Playgroud)
是完全相同一样
try {
work();
} finally {
cleanup();
}
Run Code Online (Sandbox Code Playgroud)