小编Ste*_* F.的帖子

使用 fmt::format 的代码在 Visual Studio 2022 Update 17.4 后中断

我广泛使用 fmtlib 中的 fmt::format 。将 Visual Studio 2022 从 17.3.5 更新到 17.4.0 后,我在使用代码发布版本时遇到如下问题:

\n
const std::string s1 = format("{}.{}", "abc", "test" );\n
Run Code Online (Sandbox Code Playgroud)\n

虽然 s1 和 s1.c_str() 在调试版本中是“abc.test”,但在使用 fmtlib 的发布版本中,只有 s1 是“abc.test”,并且 s1.c_str() 返回“abc.test”,后跟一些垃圾(例如“ abc.test\xc3\xb0_\xc3\xa0\xc3\xb4")。

\n

我写了一个小测试程序:

\n
#include <iostream>\n#include <string>\n#ifdef USE_STD_FORMAT\n#include <format>\nusing std::format;\n#else\n#include <fmt/format.h>\nusing fmt::format;\n#endif\n\nvoid check(const std::string& s, const std::string& expected)\n{\n    if (s != expected)\n        std::cout << "FAILED I: '" << s << "' != '" << expected << "'\\n";\n    else if (strcmp(s.c_str(), expected.c_str()) != 0)\n        std::cout << "FAILED …
Run Code Online (Sandbox Code Playgroud)

c++ fmt visual-studio-2022

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

我应该返回gsl :: span <const T>而不是const std :: vector <T>&

我有一个带有std :: vector <int>成员的类和一个返回对该向量的const引用的成员函数.

class demo {
public:
    //...

    const std::vector<int> & test() const {
        return iv;
    }

private:

    std::vector<int> iv;
};
Run Code Online (Sandbox Code Playgroud)

我计划将成员类型更改为不同的数组,如容器类型,具有足够的功能和更小的内存占用(例如std :: experimental :: dynarray,std :: unique_ptr <int []>).因此,我认为不将真实容器作为const引用返回,而是将视图作为gsl :: span <const int>返回给元素是个好主意.

class demo {
public:
    //...

    gsl::span<const int> test() const {
        return iv;
    }

private:

    std::vector<int> iv;
};
Run Code Online (Sandbox Code Playgroud)

但这会破坏使用const vector <int>的代码,因为同一个未修改的向量的两个span实例不能用于迭代元素:

demo d;

std::cout << (d.test().begin() == d.test().begin()) << "\n";
std::cout << (d.test().end() == d.test().end()) << "\n";

for( auto it = d.test().begin(), end = d.test().end(); it …
Run Code Online (Sandbox Code Playgroud)

c++ cpp-core-guidelines guideline-support-library

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