相关疑难解决方法(0)

如何在只有受保护或私有构造函数的类上调用:: std :: make_shared?

我有这个代码不起作用,但我认为意图很明确:

testmakeshared.cpp

#include <memory>

class A {
 public:
   static ::std::shared_ptr<A> create() {
      return ::std::make_shared<A>();
   }

 protected:
   A() {}
   A(const A &) = delete;
   const A &operator =(const A &) = delete;
};

::std::shared_ptr<A> foo()
{
   return A::create();
}
Run Code Online (Sandbox Code Playgroud)

但是我在编译时遇到了这个错误:

g++ -std=c++0x -march=native -mtune=native -O3 -Wall testmakeshared.cpp
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr.h:52:0,
                 from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/memory:86,
                 from testmakeshared.cpp:1:
testmakeshared.cpp: In constructor ‘std::_Sp_counted_ptr_inplace<_Tp, _Alloc, _Lp>::_Sp_counted_ptr_inplace(_Alloc) [with _Tp = A, _Alloc = std::allocator<A>, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’:
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr_base.h:518:8:   instantiated from ‘std::__shared_count<_Lp>::__shared_count(std::_Sp_make_shared_tag, _Tp*, const _Alloc&, _Args&& …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

162
推荐指数
10
解决办法
5万
查看次数

Meyers对Singleton模式线程的实现是否安全?

以下实现,使用延迟初始化Singleton(Meyers'Seingleton)线程安全吗?

static Singleton& instance()
{
     static Singleton s;
     return s;
}
Run Code Online (Sandbox Code Playgroud)

如果没有,为什么以及如何使其线程安全?

c++ multithreading design-patterns

129
推荐指数
5
解决办法
5万
查看次数

std :: shared_ptr:reset()与赋值

这是一个基本问题,但我没有找到关于它的先前帖子.以下问题的标题听起来可能与我的问题相同,但问题本身与标题不匹配:使用shared_ptr.reset还是operator =?

我对reset()成员函数的目的感到困惑std::shared_ptr:除了赋值运算符之外,它还有什么作用呢?

具体来说,给定定义:

auto p = std::make_shared<int>(1);
Run Code Online (Sandbox Code Playgroud)
  1. 以下两行是否相同:

    p = std::make_shared<int>(5);
    p.reset(new int(5));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这些怎么样:

    p = nullptr;
    p.reset();
    
    Run Code Online (Sandbox Code Playgroud)

如果两条线在两种情况下都相同,那么目的是reset()什么?


编辑:让我重新说一下这个问题,以便更好地强调它的观点.问题是:是否有一种情况reset()可以让我们在没有它的情况下实现一些不容易实现的事情?

c++ shared-ptr c++11

40
推荐指数
2
解决办法
2万
查看次数

获取此权限的lambda的访问权限

请考虑以下代码:

#include <iostream>

struct test
{
    void public_test()
    {
        [this]() { private_test(); }();
    }

private:
    void private_test()
    {
        std::cout << "test\n";
    }
};

int main()
{
    test().public_test();
}
Run Code Online (Sandbox Code Playgroud)

lambda捕获它,然后调用捕获对象的私有方法.现在这段代码test使用VC++ 2012 编译和工作(打印).虽然这是非常直观和有用的行为,但我想知道这是否可以保证按标准工作.因此,lambda是否可以私有访问通过this?捕获的任何对象?

我试着通过5.1.2 [expr.prim.lambda]的标准阅读来查看这个内容,但实际上找不到一个明确的答案(不是那么精通标准的深度).唯一对我有用的段落是

lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的nonunion类类型 - 称为闭包类型 - 其属性如下所述.此类类型不是聚合(8.5.1).闭包类型在包含相应lambda表达式的最小块作用域,类作用域或命名空间作用域中声明.[注意:这确定了与闭包类型相关联的名称空间和类的集合(3.4.2).lambda声明符的参数类型不会影响这些关联的命名空间和类. - 尾注]

但另一方面,成员函数中定义的普通本地类类型没有对周围类的私有访问权限.因此,具有私有访问权限的lambda会以某种方式将lambdas提升为仅仅是语法糖的本地函数对象更多涉及的东西,因为它需要额外的"编译器魔术"以某种方式使其成为周围类的朋友.

那么lambda是否可以私有访问通过的任何对象this,如果是,标准的哪些部分允许这种情况发生?

c++ lambda c++11

23
推荐指数
1
解决办法
2677
查看次数

为什么make_shared不能构造这个对象?

尝试创建指向对象的共享指针时遇到此错误

#include <iostream>
#include <vector>

class Foo {
public:
    std::shared_ptr<Foo> getFoo(int i) {
        auto foo = std::make_shared<Foo>(i);
        //auto foo = std::shared_ptr<Foo>(new Foo(i)); "works"
        return foo;
    }
protected:
    Foo(int i) {std::cout << "foo" << std::endl; }
};

int main(int argc, const char * argv[]) {

}
Run Code Online (Sandbox Code Playgroud)

我收到构建时错误

 Static_assert failed due to requirement 'is_constructible<Foo, int &>::value' "Can't construct object in make_shared"
Run Code Online (Sandbox Code Playgroud)

我可以通过将构造函数设为私有来避免这种情况,但我想知道为什么 make_shared 失败并且 shared_ptr(new) 有效?

c++

8
推荐指数
1
解决办法
5865
查看次数

为什么 make_unique 使用私有构造函数失败?

我正在实现一个单例类作为 c++14 中的练习,其中必须使用智能指针。此代码片段有效,但我想使用 make_unique ,不要与旧的 new 和 delete 关键字混淆,但它说它无法访问私有成员。为什么会发生?关键字“new”与智能指针一起使用是否安全?

#include <iostream>
#include <memory>

using namespace std;

class foo
{
    private:
        int val_;

    private:    
        foo() {}

    public:
        // properties
        void set(const int v) { val_ = v; }
        int  get() const { return val_; }

        //methods
        static const unique_ptr<foo>& get_instance()
        {
            static unique_ptr<foo> pfoo( new foo() );
            //unique_ptr<foo> pfoo = make_unique<foo>() ;  // Error - cannot access private member declared in class 'foo'
            return pfoo;        
        }


};

int main()
{
    foo::get_instance()->set(100); …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

5
推荐指数
0
解决办法
5200
查看次数