12-01-2022, 09:35 AM
What is the preferred method of assigning to a local member data of type std::shared_ptr<T>?
Given the code below, are the lines indicated as A20-8-6 non-compliant really so and why? We can understand C2 (types match exactly). We can understand C4 (types match exactly and the member data is of std::shared_ptr<T>&.
The class C1 we believe is non-compliant but we can't justify ourselves of the reason why.
Is the rule trying to enforce 3 e) from GoTW #91 (https://herbsutter.com/2013/06/05/gotw-9...arameters/)?
Given the code below, are the lines indicated as A20-8-6 non-compliant really so and why? We can understand C2 (types match exactly). We can understand C4 (types match exactly and the member data is of std::shared_ptr<T>&.
The class C1 we believe is non-compliant but we can't justify ourselves of the reason why.
Is the rule trying to enforce 3 e) from GoTW #91 (https://herbsutter.com/2013/06/05/gotw-9...arameters/)?
Code:
struct S {};
class C1 {
std::shared_ptr<S> s;
public:
C1(const std::shared_ptr<S>& aS) : s(aS) {} // A20-8-6 non-compliant
};
class C2 {
std::shared_ptr<S> s;
public:
C2(std::shared_ptr<S> aS) : s(aS) {} // OK
};
class C3 {
std::shared_ptr<S> s;
public:
C3(std::shared_ptr<S>& aS) : s(aS) {} // A20-8-6 non-compliant
};
class C4 {
const std::shared_ptr<S>& s;
public:
C4(const std::shared_ptr<S>& aS) : s(aS) {} // OK
};
void f () {
auto s = std::make_shared<S>();
C1 c1(std::make_shared<S>());
C2 c2(std::make_shared<S>());
C3 c3(s);
C4 c4(std::make_shared<S>());
}