相关疑难解决方法(0)

表达式 std::string {} = "..." 是什么意思?

在此代码中:

#include <iostream>

int main(void)
{
    std::string {} = "hi";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种类型的声明在 C++ 中有效。参见《Godbolt》

  • 这是什么意思?
  • 它如何有效?

作为信息,我测试了这个程序从c++11c++20标志,因为扩展初始值设定项从以后可用c++11

c++ string

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

std::filesystem::path 没有运算符+?

可以使用运算符在一行中附加/多个路径:

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C";
Run Code Online (Sandbox Code Playgroud)

这是相当方便的。然而,concat只提供+=

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C" + ".d";   // NOT OK
Run Code Online (Sandbox Code Playgroud)

这非常烦人,因为我无法轻松地将扩展添加到路径的末尾。我别无选择,只能写一些类似的东西

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C";
  p2 += ".d";
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?这种不一致有原因吗?

c++ std-filesystem

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

运算符重载,允许使用rvalue捕获但不能分配

是否有可能进行设计以及如何operator+为我的课程重载以使其成为C可能:

C&& c = c1 + c2;
Run Code Online (Sandbox Code Playgroud)

但这不可能:

c1 + c2 = something;
Run Code Online (Sandbox Code Playgroud)

编辑:我将对象更改为小写字母.c1,c2并且c是类的对象C.&&不是逻辑operator&&,而是右值参考.

例如写作:

double&& d = 1.0 + 2.0;
Run Code Online (Sandbox Code Playgroud)

是100%正确的(新)C++代码,而

1.0 + 2.0 = 4.0;
Run Code Online (Sandbox Code Playgroud)

显然是一个编译器错误.我想要完全一样,但对于我的班级,我想要双倍C.

第二次编辑: 如果我的操作符返回C或C&,我可以赋值给rvalue引用,但也可以赋值给c1 + c2,这是无意义的.给const这里禁用它,但它也禁用了对rvalue的赋值.至少在VC++ 2k10上.那么这有多重?

c++ operator-overloading rvalue-reference c++11

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

STL 中迭代器和 v.begin() 方法有什么区别?

#include <iostream>
#include <vector>

using namespace std;

int main(void){
    vector<int> v = {1, 2, 3};
    auto& it = v.begin();

    // 1.
    v.begin() += 1;
    cout << *(v.begin()); // output is 1

    // 2.
    cout << *(v.begin()+1); // output is 2
}
Run Code Online (Sandbox Code Playgroud)

上面的代码显示它v.begin() += 1;没有按我的预期工作。我不知道code1和code2之间的实际区别。v.begin() 是左值还是右值?或无?

插入时而it不是v.begin()两种情况都返回 value 2。为什么会发生这样的事情呢?

c++

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