小编uk4*_*321的帖子

模板特化中T [N]和T []之间的差异?

纵观示例实现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[]与函数参数中的不一样,它表示与指针相同的东西吗?

c++ templates template-specialization

9
推荐指数
1
解决办法
127
查看次数

为什么s.find在失败时返回string :: npos而不是s.length()

我最近很恼火地发现在大海捞针中找不到针头时会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如果找不到该项,这也与返回结束迭代器不一致.

我知道标准人都非常聪明,所以我相信他们并不是偶然想出来的.它必须在其他地方给我一些优雅,我没有看到.这有什么好理由?

c++ string find

7
推荐指数
3
解决办法
1361
查看次数

比ADL更喜欢某些功能

我想使用基于范围for来迭代UTF8编码的unicode代码点std::string.我定义我自己begin,并end在全局命名空间,但beginendstd命名空间中被优先(即那些由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使用合格的名称做手册之外别无他法吗?

c++ argument-dependent-lookup

7
推荐指数
2
解决办法
226
查看次数

为什么我不能通过值将rvalue std :: stringstream传递给函数?

为什么这段代码不能编译?

#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移动构造函数吗?

c++ rvalue move-semantics c++11

4
推荐指数
1
解决办法
510
查看次数

编程没有"终于"

我没有支持的所需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)

php try-catch-finally

3
推荐指数
1
解决办法
234
查看次数