<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近写代码,发现一件很有趣的事情,幸好我很快就发现了,否则就不是有趣而是头疼了!</span>
ok,下面我有这么一段代码:
#include <memory>
#include <cstdint>
struct CurlWriteData
{
static const uint32_t BUFFER_SIZE = 1024 * 1024; //1MB
typedef std::shared_ptr<char> CharPtr;
char* Buffer() const { return _buffer.get(); }
uint32_t _size = 0;
uint32_t _offset = 0;
//CurlWriteData() = delete;
CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)
{
if (_buffer){ return; }
if (!buffer_size){ return; }
_size = buffer_size;
_buffer = CharPtr(new char[buffer_size], [](char* ptr){ if (ptr){ delete[] ptr; } });
}
private:
CharPtr _buffer;
};
这段代码太简单了,就是一个结构体,而且还有一个带默认参数的构造函数。
默认构造1MB的内存缓冲区。下面我们可以这样定义:
CurlWriteData buffer_a;
CurlWriteData buffer_b(1024);
这样的定义看起来没错,的确没错,一般好像都这样用。
下来因为c++0x的构造函数可以使用default变的有趣。
下面是我一个类对象的使用。代码:
class TestA
{
public:
TestA() = default;
private:
CurlWriteData _curl_wtire_data;
};
这样用初看起来没问题,就是这样,创建类对象的时候就创建了CurlWriteData对象,而且应该会调用CurlWriteData的构造函数,而因为CurlWriteData构造函数使用的默认参数,所以他应该会分配1MB的内存。
结果却不是这样,我现在突然发现我对default关键字一无所知,这里先给一些朋友提醒一下。
事实上,在创建TestA对象时,TestA对象并没有构造_curl_write_data对象,我打断点调试,他并没有走到CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)里面。
ok,那试试什么都没有的默认构造函数吧,CurlWriteData(),这个我把这个构造函数加上去,结果他还是没有走到这里来。还有一个很神奇的地方,他并没有报函数调用不明确的错误。
当我使用这个对象的时候,很显然,_buffer是0,(nullptr), 但是_size却不是0,也不是BUFFER_SIZE = 1024 * 1024。
当你显式创建对象:CurlWriteData ddd;时,却是:error: call of overloaded ‘CurlWriteData()’ is ambiguous。
好了,那么我不用default吧。如下代码:
class TestA
{
public:
TestA(){}
private:
CurlWriteData _curl_wtire_data;
};
CurlWriteData()
CurlWriteData(uint32_t buffer_size = BUFFER_SIZE)
那么这个时候,就会存在ambiguous问题,调用不明确。把无参构造函数删除即可解决。
就到这里,还在用default的朋友你知道这些 吗,希望给你提个醒,如果你也是这个问题,给个赞吧~!
顺便说下我的环境:
[xxx]# g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[xxx]# gcc --version
gcc (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
centos6.5