代码:
#include <memory>
using namespace std;
struct T {};
T* foo() { return new T; }
T const* bar() { return foo(); }
int main()
{
unique_ptr< T const > p1( bar() ); // OK
unique_ptr< T const [] > a1( bar() ); // OK
unique_ptr< T const > p2( foo() ); // OK
unique_ptr< T const [] > a2( foo() ); // ? this is line #15
}
Visual C++ 10.0 和 MinGW g++ 4.4.1 的示例错误:
[d:\开发\测试] > cl foo.cpp foo.cpp foo.cpp(15) : 错误 C2248: 'std::unique_ptr<_Ty>::unique_ptr' : 无法访问在类 'std::unique_ptr<_Ty>' 中声明的私有成员 和 [ _Ty=常量 T [] ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\memory(2509) :请参阅 'std::unique_ptr<_Ty>::unique_ptr' 的声明 和 [ _Ty=常量 T [] ] [d:\开发\测试] > g++ foo.cpp -std=c++0x c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique_ptr.h:在函数'int main()'中: c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique_ptr.h:379:错误:删除函数'std::unique_ptr< _Tp [], _Tp_Deleter>::unique_ptr(_Up*, typename std::enable_if<std::is_convertible::value, void>::type*) [with _Up = T, _Tp = const T, _Tp_Deleter = std:: default_delete<const T []>]' foo.cpp:15:错误:在这里使用 [d:\开发\测试] > _
在我看来,数组版本应该接受与非数组版本相同的隐式常量添加。
不同之处在于数组版本不应该接受指向派生类的指针,而这显然是上面的机制。
代码有效吗?
如果代码在形式上无效,标准的措辞是否反映了意图(即,DR 是否合适)?
如果第一个否定,第二个否定,意图是否有缺陷(即,DR 是否合适)?