C++ 为什么';t使用可变长度数组使_共享工作?
考虑以下内容:我有一个类a,它有一个构造函数,该构造函数接受一个大小为3的整数数组作为参数 现在我想构造一个到a的共享\u ptrC++ 为什么';t使用可变长度数组使_共享工作?,c++,arrays,shared-ptr,make-shared,C++,Arrays,Shared Ptr,Make Shared,考虑以下内容:我有一个类a,它有一个构造函数,该构造函数接受一个大小为3的整数数组作为参数 现在我想构造一个到a的共享\u ptr shared\u ptr(新参数)) 一切都很好 但是如果我尝试使用 make_shared(参数) 编译器发出错误消息。只有在堆栈上声明参数数组并使用变量作为数组大小(int参数[n])时,才会发生这种情况 当使用静态数组(int参数[3])或在堆上分配新的数组时,问题就消失了 我的意思是,这不是一个严重的问题,因为有提到的解决办法。尽管如此,我还是希望您能解释一
shared\u ptr(新参数))
一切都很好
但是如果我尝试使用
make_shared(参数)
编译器发出错误消息。只有在堆栈上声明参数数组并使用变量作为数组大小(int参数[n])时,才会发生这种情况
当使用静态数组(int参数[3])或在堆上分配新的数组时,问题就消失了
我的意思是,这不是一个严重的问题,因为有提到的解决办法。尽管如此,我还是希望您能解释一下为什么会发生whis
顺便说一句,我使用的是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;
}
#包括
#包括
使用名称空间std;
//一些简单的类
甲级
{
公众:
A(){};
(int-var[3]){};//某个以数组为参数的非默认构造函数
无效的FO(){CUT VLAs不存在于C++中。GCC(和CLANI认为)将它作为扩展。使用向量代替。您的“一些非默认构造函数,以数组作为参数”确实有一个指针作为参数。它与<代码> A(int *var){}相同。
@Mat好的,谢谢!我不知道STL不支持VLA。make_shared
完全向前,但是GCC/clang中实现的VLA不能用于模板参数。使用+var
强制衰减指针-或者干脆不要使用VLA。
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!
^