小编Bil*_*ias的帖子

聚合初始化绕过私有类构造函数

我一直认为聚合初始化是为了让编码人员免于编写自定义构造函数。然而,这似乎“潜入”了私有构造函数的“安全旁路”。

假设我有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

没有答案的类似问题:私有聚合初始化

c++ private friend aggregate-initialization

4
推荐指数
1
解决办法
364
查看次数

为什么在函数中返回 shared_ptr 时不将其隐式转换为布尔值?

以下不会编译:

#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)

标准(我认为)不允许在这里进行隐式转换的原因是什么?

c++ boolean return-type shared-ptr implicit-conversion

3
推荐指数
1
解决办法
72
查看次数

如何无缝循环FLV

我正在以"标准方式"播放循环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播放器的错误吗?

flash video flv loops actionscript-3

2
推荐指数
1
解决办法
1万
查看次数

GCC错误:使用MSVC C++代码在')'令牌之前的预期主表达式

以下是由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)

c++ gcc compiler-errors visual-c++

2
推荐指数
1
解决办法
1202
查看次数

C++:使用std :: map进行微小的内存泄漏

我正在编写一个自定义文本文件 - 数据解析器(类似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*'显然是一个简单的类指针,所以也没什么奇怪的.

现在抓住了:

  1. 这一行在解析过程中执行了很多次,但我只得到一个16字节的块泄漏.
  2. 如果我解析另一个文件,则没有另外16字节的内存泄漏
  3. 如果我从内存中删除解析器(通过在{}代码块中删除它),然后在另一个代码块中重新创建它并让它解析另一个文件,然后我得到第二个 16字节内存泄漏.

这让我怀疑std :: map中存在内存泄漏; 但它也可能是我的错误...我很确定这是违规行,因为如果我之前停止解析,就没有内存泄漏; 还有就是内存泄漏,如果我只是停止解析后,这条线.

任何人都可以评论这个吗?

c++ memory memory-leaks

1
推荐指数
1
解决办法
3892
查看次数

sizeof(int)总是等于sizeof(void*)

可能重复:
sizeof(int)== sizeof(void*)?

我想知道是否保证在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)

c++

1
推荐指数
1
解决办法
546
查看次数

将函数用作非类型模板参数时出错

我有这个模板:

        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)

我收到这些错误: …

c++ parameters templates function

0
推荐指数
1
解决办法
1944
查看次数

不可原谅的GCC C++编译器

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++ compiler-construction gcc visual-c++

0
推荐指数
2
解决办法
622
查看次数