我一直认为聚合初始化是为了让编码人员免于编写自定义构造函数。然而,这似乎“潜入”了私有构造函数的“安全旁路”。
假设我有class A一个我只想由 来创建的东西class B。
struct A
{
friend class B;
const int i, k;
private:
A () = default;
};
class B
{
public:
A what () { return {1, 2}; }
};
int main ()
{
B b {};
A a {2,3}; // oh no
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的示例编译并运行良好,并且通过使用大括号,我可以非常轻松地A在任何地方创建对象。
防止这种情况的唯一方法是编写一个用户构造函数,然后完全取消聚合初始化。
所以我的问题是:聚合初始化是默认的“隐藏public”构造函数吗?
实例: https: //onlinegdb.com/r1jHLxzRD
没有答案的类似问题:私有聚合初始化
以下不会编译:
#include <memory>
class A;
bool f() {
std::shared_ptr<A> a;
return a;
}
int main()
{
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并失败:
Compilation failed due to following error(s).main.cpp: In function ‘bool f()’:
main.cpp:13:12: error: cannot convert ‘std::shared_ptr’ to ‘bool’ in return
return a;
Run Code Online (Sandbox Code Playgroud)
标准(我认为)不允许在这里进行隐式转换的原因是什么?
我正在以"标准方式"播放循环FLV:
netstream.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
Run Code Online (Sandbox Code Playgroud)
...
public function onStatus(item:Object):void {
if (item.info.code == "NetStream.Play.Stop") {
if (loop) netstream.seek(0);
}
Run Code Online (Sandbox Code Playgroud)
通过Flash CS 5.5创作工具(测试影片或调试影片)播放时,视频无缝循环.但!在浏览器或独立调试Flash播放器(均为v.11.2.202.233)中播放时,在视频"倒带"之前会有大约1秒的异常暂停.
这是最新Flash播放器的错误吗?
以下是由GCC产生的非常奇怪的错误的代码,而不是由MSVC产生的错误(5个错误,在错误行的注释表中引用):
/* Match STRING against the filename pattern PATTERN, returning zero if
it matches, nonzero if not. */
int GNU_fnmatch (const char* pattern,const char* string,int flags)
{
register const char *p = pattern, *n = string;
register unsigned char c;
#define FNM_CASEFOLD 16
#define FNM_LEADING_DIR 8
#define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
while ((c = *p++) != '\0')
{
c = FOLD (c);
switch (c)
{
case '?':
if (*n == '\0')
return 1;
else if …Run Code Online (Sandbox Code Playgroud) 我正在编写一个自定义文本文件 - 数据解析器(类似JSON),我已经失去了很多小时试图在其中找到微小的内存泄漏.
我正在使用VC++ 2008和命令_CrtMemCheckpoint和_CrtDumpMemoryLeaks来检查内存泄漏.
当我解析任何文件然后将其从内存中删除(与所声称的任何其他内存一起)时,我得到一个16字节的内存泄漏,如下所示:
{290} normal block at 0x00486AF0, 16 bytes long.
Data: < H `aH hH eH > C0 9A 48 00 60 61 48 00 18 68 48 00 D8 65 48 00
Run Code Online (Sandbox Code Playgroud)
我设法将"违规"代码行缩小到这个范围:
classDefinitions[FastStr(cString)] = classDef;
Run Code Online (Sandbox Code Playgroud)
classDefinitions是一个std::map<FastStr, FSLClassDefinition*>并且是我的解析器类的私有成员.
FastStr是一个简单的char*"包装器",允许使用简单的c字符串作为键值; 它没有内存泄漏(没有'新'命令).'FSLClassDefinition*'显然是一个简单的类指针,所以也没什么奇怪的.
现在抓住了:
这让我怀疑std :: map中存在内存泄漏; 但它也可能是我的错误...我很确定这是违规行,因为如果我在它之前停止解析,就没有内存泄漏; 还有就是内存泄漏,如果我只是停止解析后,这条线.
任何人都可以评论这个吗?
我想知道是否保证在32位和64位系统sizeof(int)中总是等于sizeof(void*)(即分别为32位和64位).
另外,我需要知道是否始终保证a long int可以容纳a int和a 的位void*,例如
long int lint = (((int)integer)<<sizeof(int)) | (void*)ptr;
Run Code Online (Sandbox Code Playgroud) 我有这个模板:
template <class SourceFormat, class DestFormat, void (*convert)(DestFormat, SourceFormat)>
static void _draw(...);
Run Code Online (Sandbox Code Playgroud)
而这些功能:
template <class Class1, class Class2>
inline static void convertNone(Class1& dest, Class2& source) {
dest = source;
};
inline static void convertARGB_GREY(unsigned __int32& dest, unsigned __int8& source) {
dest = source + (source << 8);
dest += (dest << 16);
};
Run Code Online (Sandbox Code Playgroud)
我在另一个函数中使用模板:
void Blitter::draw(...) {
if (...) {
_draw<unsigned __int32, unsigned __int32, &convertNone>(...);
} else {
_draw<unsigned __int32, unsigned __int8, &convertARGB_GREY>(...); // ERRORS go here!
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这些错误: …
MS VS x86编译器对以下定义没有任何问题,但GCC(ARM)抱怨.GCC是哑的还是MSVS_x86太聪明了?
bool checkPointInside(const CIwVec2& globalPoint) {
return checkPointIn(globalPoint, CIwVec2());
}; /// error: no matching function for call to 'Fair::Sprite::checkPointIn(const CIwVec2&, CIwVec2)'
bool checkPointIn(const CIwVec2& globalPoint, CIwVec2& localPoint) {
return false;
};
Run Code Online (Sandbox Code Playgroud) c++ ×7
gcc ×2
visual-c++ ×2
boolean ×1
flash ×1
flv ×1
friend ×1
function ×1
loops ×1
memory ×1
memory-leaks ×1
parameters ×1
private ×1
return-type ×1
shared-ptr ×1
templates ×1
video ×1