标签: function-qualifier

在 C++ 中使用带 ref-qualifier 的子成员函数重载不带 ref-qualifier 的父成员函数

在 C++ 中,不能在一个类中用没有 ref-qualifier 的成员函数重载带有 ref-qualifier 的成员函数。但同时可以从父类继承一个成员函数并在子类中重载它,如示例所示:

struct A {
    void f() {}
    //void f() & {} //overload error everywhere
};

struct B : A {
    using A::f;
    void f() & {} //ok everywhere
};

int main() {
    B b;
    b.f(); //ok in GCC only
}
Run Code Online (Sandbox Code Playgroud)

只是在调用的过程中f,Clang抱怨道call to member function 'f' is ambiguous。但GCC接受程序没有任何错误,演示: https: //gcc.godbolt.org/z/5zzbWcs97

这里是哪个编译器?

c++ overloading language-lawyer ref-qualifier function-qualifier

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

返回对数据成员的 const 引用的成员函数是线程安全的吗?

考虑这个类:

#include <vector>

class A {
private:
    std::vector<int> m_vector;
public:
    void insertElement(int i) {
        m_vector.push_back(i);
    }
    const std::vector<int>& getVectorRef() const {
        return m_vector;
    }
};
Run Code Online (Sandbox Code Playgroud)

该方法getVectorRef线程安全吗?

是否有可能在另一个线程返回期间getVectorRef弹出并调用,insertElement从而导致成员向量发生更改并且调用者getVectorRef获得错误的 const 引用?

两个 const 限定符(一个用于向量,另一个用于成员函数)在线程安全上下文中没有意义吗?

c++ const-correctness thread-safety function-qualifier

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

避免重复 const 和非 const 版本的 getter?

struct BananaHolder
{
    vector<Banana>& getBananas();
    const vector<Banana>& getBananas() const;
};
Run Code Online (Sandbox Code Playgroud)

我的课程充满了这种重复。

有没有更干净、更优雅的替代方案?

c++ getter c++11 function-qualifier explicit-object-parameter

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

摆脱 C++ 中令人讨厌的函数类型的可能方法?

所以我最近接触到了C++中所谓的“令人厌恶的函数类型”的怪诞(据我所知源自这篇论文:https ://www.open-std.org/jtc1/sc22/wg21/文档/论文/2015/p0172r0.html)。我想了一会儿,它似乎确实有一定的道理,但如果有人以某种方式将它们从语言中完全删除,一切都会变得更加干净和更令人满意。

也许还有其他来源,但是(至少对我来说)令人讨厌的函数类型的大多数问题都来自于处理成员函数。如果我想获取成员函数的类型,我会这样做:

template <typename T>
struct remove_ptr_to_member { using type = T; };

template <typename T, typename class_t>
struct remove_ptr_to_member<T class_t::*> { using type = T; };

struct container {
   void func() const;
};

using member_function_type = typename remove_ptr_to_member<decltype(container::func)>::type;
Run Code Online (Sandbox Code Playgroud)

const由于的声明中存在 a func(),删除指向成员的指针部分会给我们留下一个令人讨厌的函数。

this如果将不可见参数放入成员函数的类型中,则可以避免这种情况。然后,通常会导致令人讨厌的函数的东西都将应用于参数thisconst意味着一个const this指针,&&意味着对 实例的右值引用this,等等......)。

现在,即使删除类型的指向成员的指针部分,剩下的也只是完全正常的函数类型。这样做的好处是,它会减少您在实现诸如is_function.

经典方法:

// primary template
template<class>
struct is_function : std::false_type { };
 
// specialization for regular functions …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming function function-qualifier

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

const 成员函数中的 const 参数

我读过 const 的用例,我觉得我对 const 的大部分都有很好的理解。但是,我似乎无法弄清楚为什么我不经常看到这种情况:

void someFunction(const string& A) const
Run Code Online (Sandbox Code Playgroud)

const 成员函数中有 const 参数。出于某种原因,每当我查找示例并且该函数是 const 时,const 似乎都被从参数中删除,如下所示:

void someFunction(string& A) const
Run Code Online (Sandbox Code Playgroud)

然而,这似乎并没有阻止我修改 A。在 const 成员函数中使用 const 参数是否被认为是不好的形式?

如果 A 不被修改,那么参数中不保留 const 的原因是什么?

编辑:这是我没有澄清的错误,但我理解在参数之前添加它和在函数之后添加它之间的区别。我看过的很多代码都没有将两者结合起来,我只是想弄清楚这是否有原因。

c++ constants function-qualifier

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