相关疑难解决方法(0)

在C和C++中通过索引[array]访问数组

有一个小技巧问题,一些采访者喜欢问什么原因:

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
Run Code Online (Sandbox Code Playgroud)

根据我的理解,a[b]转换为*(a + b)并且因为加法是可交换的,所以它们的顺序并不重要,所以2[a]它确实*(2 + a)很好.

这可以保证按C和/或C++的规格工作吗?

c c++ arrays square-bracket

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

操作员新的重载和对齐

我正在超载operator new,但我最近遇到了对齐的问题.基本上,我有一个类IBase,提供operator newdelete所有必要的变种.所有类都派生自IBase并因此也使用自定义分配器.

我现在面临的问题是我有一个孩子Foo必须是16字节对齐,而所有其他孩子在对齐到8字节时都很好.然而,我的内存分配器只在默认情况下与8字节边界对齐,所以现在代码IBase::operator new返回一个不可用的内存块.这应该如何正确解决?

我可以简单地强制所有分配为16个字节,这将正常工作,直到弹出一个32字节对齐的类型.弄清楚里面的对齐operator new似乎并不是微不足道的(我可以在那里进行虚函数调用以获得实际的对齐吗?)推荐的处理方法是什么?

我知道malloc应该返回一块适合所有内容的内存,不幸的是,这个"所有内容"不包含SSE类型,我真的很想让这个工作无需用户记住哪种类型有哪个对齐.

c++ operator-overloading new-operator

34
推荐指数
2
解决办法
7025
查看次数

C++中经常被误解的概念是什么?

在c ++中经常被误解的概念是什么?

c++

33
推荐指数
21
解决办法
6630
查看次数

为什么arr [-2]不等于-2 [arr]?

#include <iostream>
using namespace std;

int main() 
{
    int arr[3] = { 10, 20, 30 };
    cout << arr[-2] << endl;
    cout << -2[arr] << endl;        
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

4196160
-30
Run Code Online (Sandbox Code Playgroud)

arr[-2]超出范围并且无效,导致未定义的行为.但-2[arr]评估为-30.为什么?

arr[-2]等于-2[arr]

c++ arrays undefined-behavior

32
推荐指数
3
解决办法
8296
查看次数

.*&运营商做什么?

我偶然发现了这个问题,其答案使用了一个奇怪的结构:

typedef std::queue<int> Q;
typedef Q::container_type C;

C & get (Q &q)
{
    struct hack : private Q {
        static C & get (Q &q) {
            return q.*&hack::c;
        }
    };
    return hack::get(q);
}
Run Code Online (Sandbox Code Playgroud)

我通常遵循它q可以访问cget函数引用的自己的成员.但是,我无法清楚地解释它.究竟发生了什么.*&,为什么允许?

c++ stl c++11

31
推荐指数
2
解决办法
1268
查看次数

为什么受保护的构造函数会引发此代码的错误?

关于受保护构造函数的一个问题 我了解到受保护的构造函数可以在派生类中使用.但是,我发现下面的代码有错误.为什么会这样?

class A
{
    protected:
        A(){}
};

class B: public A {
    public:
        B() {
            A* f=new A();           // Why it is not working here
        }
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor protected

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

我可以在for循环的初始化中声明不同类型的变量吗?

为什么这个C++代码不能在VS2010下编译:

for ( int a = 0, short b = 0; a < 10; ++a, ++b ) {}
Run Code Online (Sandbox Code Playgroud)

虽然这个做了:

short b = 0;
for ( int a = 0; a < 10; ++a, ++b ) {}
Run Code Online (Sandbox Code Playgroud)

是否禁止在for-loop初始化程序中声明两个不同类型的变量?如果是这样,你怎么解决它?

c++ scope for-loop initializer variable-declaration

24
推荐指数
2
解决办法
5150
查看次数

在C++中输入safe(r)bitflags?

虽然修改一些老的C++代码,我在几个跑bitflags定义为枚举.

enum FooFlags
{
    FooFlag1 = 1 << 0,
    FooFlag2 = 1 << 1,
    FooFlag3 = 1 << 2
    // etc...
};
Run Code Online (Sandbox Code Playgroud)

这并不罕见,但是一旦你开始组合标志就会让你感到困扰,你会丢失类型信息.

int flags = FooFlag1 | FooFlag2;   // We've lost the information that this is a set of flags relating to *Foo*
Run Code Online (Sandbox Code Playgroud)

一些搜索结果显示我并不是唯一 一个被这个困扰的人.

一种替代方法是将标志声明为#defines或const积分,因此按位运算不会转换类型(可能).这个问题是它允许我们的位设置与不相关的标志,通过整数或其他枚举混合.

我熟悉std :: bitsetboost :: dynamic_bitset,但两者都不是为解决我的问题而设计的.我正在寻找的东西就像C#的FlagsAttribute.

我的问题是,对于(更多)类型安全的位标志,还有哪些其他解决方案?

我将在下面发布我自己的解决方案.

c++ enums bitflags type-safety c++11

23
推荐指数
3
解决办法
5309
查看次数

请问"variableName;" C++声明在任何时候都是无操作的?

在C++中,有时会定义一个变量,但不会使用.这是一个示例 - 与COM_INTERFACE_ENTRY_FUNC_BLINDATL宏一起使用的函数:

HRESULT WINAPI blindQuery( void* /*currentObject*/, REFIID iid, void** ppv, DWORD_PTR /*param*/ ) 
{
    DEBUG_LOG( __FUNCTION__ ); //DEBUG_LOG macro expands to an empty string in non-debug
    DEBUG_LOG( iid );
    iid; // <<<<<<<----silence compiler warning
    if( ppv == 0 ) {
        return E_POINTER;
    }
    *ppv = 0;
    return E_NOINTERFACE;
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,iid参数与DEBUG_LOG宏一起使用,在非调试配置中扩展为空字符串.因此,iid不能选择在签名中注释或删除变量名称.当编译非调试配置时,编译器会产生C4100: 'iid' : unreferenced formal parameter警告,因此为了使警告静音iid;,添加了被认为是无操作的语句.

问题如下:如果我们有以下任何声明:

 CSomeType variableName; //or
 CSomeType& variableName; //or
 CSomeType* variableName;
Run Code Online (Sandbox Code Playgroud)

将在C++代码中的以下语句:

variableName; …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-warnings

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

使用模板返回值.如何处理无效返回?

我有用于存储回调函数的结构,如下所示:

template<class T>
struct CommandGlobal : CommandBase
{
    typedef boost::function<T ()> Command;
    Command comm;

    virtual T Execute() const
    {
        if(comm)
            return comm();
        return NULL;
    }
};
Run Code Online (Sandbox Code Playgroud)

看起来它应该工作正常,除非T是无效的,因为Execute函数想要返回一个值..

这个问题的最佳解决方案是什么?

谢谢!

c++ templates callback

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