由于这种代码,我最近遇到了一些奇怪的错误。
vector<int> a(a);
为什么接受上面的代码?什么时候需要? 如何要求编译器禁止这种用法? 谢谢。
答案 0 :(得分:6)
最常见的用例实际上是C语言,而不是C ++(你不应该在C ++中使用malloc
,尽管你可以),但在这种情况下C ++是向后兼容的:
mytype *p = malloc(sizeof *p);
允许在初始值设定项表达式中使用p
,您可以将sizeof *p
传递给malloc
,确保无论mytype
的大小是多少,正确的大小都将是分配。如果您不允许执行*p
,那么上面的表达式必须具有类型mytype
两次,稍后代码中的维护可能会更新其中一种类型而无法更新另一种类型。 / p>
答案 1 :(得分:2)
这是一个实际使用的不寻常的构造,但是如果一个类有一个构造函数由于某种原因引用某个其他对象,并且调用者可能想要将该对象循环到它自己的初始化中它会很有用
这是一个人为的例子:
#include <iostream>
using namespace std;
struct PrintAnAddress {
PrintAnAddress()
: msg_("")
, addr_(NULL)
{ }
PrintAnAddress( char const *msg, PrintAnAddress const &that )
: msg_( msg )
, addr_( &that )
{ }
void operator()( ostream &os ) const {
cout << msg_ << addr_ << endl;
}
private:
char const *msg_;
PrintAnAddress const *addr_;
};
int main() {
PrintAnAddress p1;
PrintAnAddress p2( "p1:", p1 );
PrintAnAddress p3( "self:", p3 );
p1(cout);
p2(cout);
p3(cout);
}
定义p2
时,设置为打印p1
的地址,但定义p3
时,设置为打印自己的地址。如果p3
变量尚未在范围内,则无法引用它以便在初始化时传递它。 (至少,不是没有检测类并以某种方式访问this
指针。)
我确信这个构造有一些有用且有效的应用程序,但正如我所说,这很不寻常,所以现在没有人想到。