相关疑难解决方法(0)

从指向const的指针中删除const是否遵循C中的严格别名,并引用同一个对象?

C中的以下代码是否定义了行为?

int main() {
    const int i = 0;
    return *(int*)(&i);
}
Run Code Online (Sandbox Code Playgroud)

我问,因为6.5/7列出了"与对象的有效类型兼容的类型的合格版本"作为有效别名.但是对象的有效类型是const int,我认为不是int合格版本const int(尽管反之亦然).既不是intconst int兼容(6.7.3/10).

此外,6.3.2.3/2表示您可以通过添加限定符来转换指针类型,并且结果指针是相等的.6.3.2.3/7表示你可以转换任何两种指针类型(因此(int*)(&i)允许转换本身).但是并没有说结果指针指的是同一个对象,甚至它是相等的.它说的是它可以转换回原始类型(在这种情况下const int*).也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向的指针i.

那么,标准是否实际定义了我的代码的行为,如果是,那么这个定义在哪里?

我知道代码在实践中有效.我想到了一个不起作用的假设(和奇怪)实现.我可以问这个实现是否符合标准(如果不符合,它违反了哪个部分),但如果还有其他方面,我想象的实现无法符合,我不想浑水.如果有人认为这将有助于他们回答问题,我将描述实施.

c const strict-aliasing language-lawyer

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

C++ 11中unique_ptr的向量

我最近切换到C++ 11,我试图习惯那里的良好实践.我最终经常处理的是:

class Owner
{
private:
    vector<unique_ptr<HeavyResource>> _vectorOfHeavyResources;
public:
    virtual const vector<const HeavyResource*>* GetVectorOfResources() const;
};
Run Code Online (Sandbox Code Playgroud)

这需要我做一些事情,比如添加一个_returnableVector并翻译源向量以便以后能够返回它:

_returnableVector = vector<HeavyResource*>;
for (int i=0; i< _vectorOfHeavyResources.size(); i++)
{
    _returnableVector.push_back(_vectorOfHeavyResources[i].get());
}
Run Code Online (Sandbox Code Playgroud)

有人注意到类似的问题吗?您有什么想法和解决方案?我是否在这里获得了所有的所有权想法?

更新:还有另外一件事:如果一个类返回某些处理的结果vector<unique_ptr<HeavyResource>>(它将结果的所有权传递给调用者)会怎样,并且它应该用于某些后续处理:

vector<unique_ptr<HeavyResource>> partialResult = _processor1.Process();
// translation
auto result = _processor2.Process(translatedPartialResult); // the argument of process is vector<const HeavyResource*>
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr c++11

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

标签 统计

c ×1

c++ ×1

c++11 ×1

const ×1

language-lawyer ×1

strict-aliasing ×1

unique-ptr ×1