ref-qualifier相关内容
我最近learned成员函数可以ref-qualified,这允许我写 struct S { S& operator=(S const&) & // can only be used if the implicit object is an lvalue { return *this; } }; S operator+(S const &, S co
..
这在clang 3.3中可以正常编译: 模板结构M;模板结构M{};模板结构M{}; 但在gcc 4.8.1中失败: [...]错
..
我正在尝试通过ref限定符强制在类的仅左值实例上调用类的const'getter'方法,并且由于某种原因得到了意外的结果(我正在通过 c ++ 1z 标志在 Windows C ++ 17 支持的 clang 6.0.1 进行编译>): 声明 bool getVal()const& 允许在右值引用上也调用该方法. 声明 bool getVal()& ;; 据我了解,不允许在右值引
..
为什么要使用STL容器的元素访问成员功能,例如 std :: array :: operator [] 或 std :: vector :: operator [] 没有右值引用限定符重载?当然我可以做 std :: move(generate_vector()[10]),但是我很好奇在标准化ref限定符时是否考虑添加右值ref限定符重载. 我认为 std :: array 和
..
我想知道,是否有原因导致标准类型的赋值运算符不符合左值引用的条件?他们都不是. 因此,我们可以编写如下代码: std :: string {} ="42";std :: string s =“你好" + std :: string {"world"} =“哎呀!";std :: vectorv = {1,2,3};std :: move(v)= {4,5,6}; 如果赋值
..
如我所见,一般规则是完全不从函数返回r值引用(罕见的除外)特别案例)。但是类方法呢? C ++标准库中有一个示例,该示例从类的r值ref限定的方法返回r值引用( std :: optional :: operator *( ) 和 std :: optional 类的> std :: optional :: value() 方法)。请参见C ++ 17标准的 23.6
..
在下面的C ++ 11 +代码中,应该首选哪种返回语句构造? #include struct Bar { }; 结构Foo { 吧台; Bar get()&& { return std :: move(bar); // 1 返回条; // 2 } }; 解决方案 好吧,因为它是具有r值ref资格的成员函数,此
..
类似于如何删除相似的const和非const成员函数之间的代码重复?,我要删除 假设我有一个类似这样的类: class MyStringBuilder { std :: string成员; public: //其他函数 std :: string create()const& { //一些工作 std :: string result = member; //更
..
最近我了解了函数的引用限定符,例如 struct foo { void bar(){} void bar1()& {} void bar2()&& {} }; 在我可能需要此功能的地方,该语言功能是否有实际用例? 解决方案 基本上有两种用途: 为了提供优化的重载,例如将成员移出临时对象,而不必复制它。 防止滥用API。例如,
..
给定以下转换运算符 struct A { template显式运算符T& ()& ;; template显式运算符const T& ()const& ;; }; struct B {}; 我希望以下转换全部有效,但有些给
..
如果没有其他重载(例如 f(T&)或 f(volatile T&& c $ c>)( template f(T& amp;); ,则 T&&& 是所谓的转发引用和 T 是 U 或 U& 一些 cv限定类型 U 。但是对于成员函数的 cv-ref-qualifiers ,没有这样的规则。在 struct S {void f()&& {; }}; a S :: f()始终为rvalue-引
..
我发现一个奇怪的行为,当用 G ++ ( gcc 4.8.1和 MinGW $ c> -std = gnu ++ 1y flag)。在SSCCE的精神我孤立以下代码片段: struct C { template auto f(X&&)const& {; } template auto f(X&&)& {; } t
..
使用ref限定的函数重载时,我从 GCC(4.8.1)和 Clang(2.9和trunk)得到不同的结果。考虑下面的代码: #include #include struct foo { int& bar()& { std :: cout
..