小编kos*_*sky的帖子

为什么 std::string append 不会在 rval ref 上重载?

我熟悉,appendinstd::string返回std::string&,因此它没有资格被移出,所以结果不会被移动。

#include <string>


int main()
{
    std::string s = std::string("A").append("B");
    return s.size();
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/M63aWW

#include <string>


int main()
{
    std::string s = std::move(std::string("A").append("B"));
    return s.size();
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/jTnsac

在那里你可以看到,后一个例子将产生一个更少的分配,因此在这种情况下,最好移动一些看起来像临时的东西。我的问题是,为什么他们(委员会)不添加简单的过载&&,使结果append要么std::string&,或者std::string&&根据上下文?我的意思是类似于std::optional正在做的事情value。有没有一个例子可以证明这种优化是假的?

c++ stdstring rvalue-reference stdoptional

4
推荐指数
2
解决办法
142
查看次数

std :: variant与内部std :: nullptr_t的比较

我的问题可以总结为以下代码

#include <variant>

int main()
{
    using V = std::variant<int, std::nullptr_t>;
    V a = 0;
    V b = nullptr;

    a < b;
}
Run Code Online (Sandbox Code Playgroud)

我希望std::nullptr_t内部具有变体,并且希望能够比较这些变体。它可以在Visual Studio 2018(版本16.1.X)上运行,但无法在版本16.3.1上进行编译。我以为这是编译器中的错误,但现在不确定。我找不到std::nullptr_t支持比较运算符的任何信息,甚至GCCClang也似乎不同意。它应该工作吗?此外,如果没有正确答案,是否有办法使它起作用?为定义运算符std::nullptr_t似乎无效。

inline bool operator<(std::nullptr_t, std::nullptr_t)
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

由于定义关系运算符只能在类参数上完成。

谢谢。

c++ c++17

2
推荐指数
1
解决办法
77
查看次数

FindNextFile命令NTFS

FindNextFile WinApi函数用于列出目录的内容.微软在文档中说明,该顺序依赖于文件系统.但是NTFS在大多数情况下应该按字母顺序排列.

此函数返回文件名的顺序取决于文件系统类型.使用NTFS文件系统和CDFS文件系统时,名称通常按字母顺序返回.对于FAT文件系统,名称通常按文件写入磁盘的顺序返回,这可能是也可能不是按字母顺序排列.但是,如前所述,这些行为无法保证.

我的应用程序需要一些目录中的对象排序.由于大多数Windows用户使用NTFS,我想优化我的应用程序.因此我使用函数_wcsicmp进行名称比较.大多数情况下它是正确的,FindNextFile的结果是根据_wcsicmp排序的.但有时候结果没有排序.我想,这很自然,因为FindFirstFile不保证顺序,我必须对它进行排序(如果是另一个文件系统).然后我注意到奇怪的模式.看起来字母'_'在字母后返回.带有内容的文件夹(a.txt,b.txt,_. txt)按顺序a,b,_返回.函数_wcsicmp将其排序为_,a,b.在Windows 8.1上测试过.我运行了一些测试,这种行为是一致的.

有人可以解释一下NTFS使用的比较标准是什么?或者为什么FindNextFile会按字母顺序返回名称?

winapi ntfs

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

标签 统计

c++ ×2

c++17 ×1

ntfs ×1

rvalue-reference ×1

stdoptional ×1

stdstring ×1

winapi ×1