为什么make_shared不能使用可变长度数组?

时间:2015-03-09 16:23:03

标签: c++ arrays shared-ptr make-shared

请考虑以下内容:我有一个带有构造函数的类A,它使用大小为3的int作为参数。

现在我想构建一个shared_ptr到A.如果我使用

shared_ptr<>(new A (parameter))

一切都很好。

但如果我尝试使用

make_shared<A>(parameter)

编译器给出错误消息。只有在堆栈上声明参数数组并且变量为数组大小(int参数[n])

时才会发生这种情况。

使用静态数组(int参数[3])或使用new分配堆上的数组时,问题就消失了。

我的意思是,这不是严重的问题,因为有上述的解决方法。不过,我会很感激为什么威尔士发生的任何解释......

顺便说一句,我正在使用g ++ 4.8.2。

这是一个最小的例子和错误日志:

#include <iostream>
#include <memory>

using namespace std;

// some simple class
class A
{
public:
    A () {};
    A (int var[3]) {}; // some non-default constructor with an array as argument
    void foo (){cout << "foo()" << endl;};
};

int main()
{
    // make a shared_ptr to A
    shared_ptr<A> ptr;

    // allocate an array var1 of size nVars=3 on the stack
    int nVars = 3;
    int var1[nVars];
    ptr = shared_ptr<A> (new A(var1)); // without make_shared, the c'tor is recognized
    ptr->foo();
    ptr = make_shared<A> (var1); // <- error at compile time!
    ptr->foo();

    // same with static array var2 of size 3
    int var2[3];
    ptr = make_shared<A> (var2); // <- no compilation error
    ptr->foo();

    // same with dynamic array var3 of size 3
    int* var3 = new int[nVars];
    ptr = make_shared<A> (var3); // <- no compilation error
    ptr->foo();

    return 0;
}

构建日志:

g++ -std=c++0x -D__GXX_EXPERIMENTAL_CXX0X__ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp: In function ‘int main()’:
../main.cpp:25:28: error: no matching function for call to ‘make_shared(int [(((sizetype)(((ssizetype)nVars) + -1)) + 1)])’
  ptr = make_shared<A> (var1); // <- error at compile time!
                            ^
../main.cpp:25:28: note: candidate is:
In file included from /usr/include/c++/4.8/memory:82:0,
                 from ../main.cpp:2:
/usr/include/c++/4.8/bits/shared_ptr.h:610:5: note: template<class _Tp, class ... _Args> std::shared_ptr<_Tp1> std::make_shared(_Args&& ...)
     make_shared(_Args&&... __args)
     ^
/usr/include/c++/4.8/bits/shared_ptr.h:610:5: note:   template argument deduction/substitution failed:
../main.cpp:25:28: note:   variable-sized array type ‘int (&)[(((sizetype)(((ssizetype)nVars) + -1)) + 1)]’ is not a valid template argument
  ptr = make_shared<A> (var1); // <- error at compile time!
                            ^

欢迎并提前感谢您的回答!

树里

0 个答案:

没有答案