标签: const-cast

const_cast安全吗?

我找不到太多的信息const_cast.我能找到的唯一信息(在Stack Overflow上)是:

const_cast<>()用于添加/删除变量的常量(岬)(或挥发性岬).

这让我很紧张.可能const_cast会导致意外行为?如果是这样,什么?

或者,什么时候可以使用const_cast

c++ casting const-cast

88
推荐指数
6
解决办法
5万
查看次数

正确使用const_cast <>

作为一个通用规则,const_cast<>()在C++代码中使用它通常被认为是一种不好的做法,因为它(大多数情况下)揭示了设计中的一个缺陷.

虽然我完全同意这种说法,但是我不知道什么是例使用const_cast<>()确定唯一的解决办法.

你能不能给我一些你认识/遇到过的例子?

非常感谢你.

c++ const-cast

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

Idiomatic way to create an immutable and efficient class in C++

I am looking to do something like this (C#).

public final class ImmutableClass {
    public readonly int i;
    public readonly OtherImmutableClass o;
    public readonly ReadOnlyCollection<OtherImmutableClass> r;

    public ImmutableClass(int i, OtherImmutableClass o,
        ReadOnlyCollection<OtherImmutableClass> r) : i(i), o(o), r(r) {}
}
Run Code Online (Sandbox Code Playgroud)

The potential solutions and their associated problems I've encountered are:

1. Using const for the class members, but this means the default copy assignment operator is deleted.

Solution 1:

struct OtherImmutableObject {
    const int i1;
    const int i2;

    OtherImmutableObject(int i1, …
Run Code Online (Sandbox Code Playgroud)

c++ const immutability const-cast

37
推荐指数
4
解决办法
2920
查看次数

如何使用const_cast?

我的类中有一个私有变量Student定义为:

const int studentNumnber;
Run Code Online (Sandbox Code Playgroud)

我正在尝试为学生编写一个复制构造函数,我需要抛弃constness来执行此操作,遗憾的是我不明白如何使用std::const_cast.

这是我在我的复制构造函数中尝试做的事情:

    Student(const Student & s) 
        : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0), studentNumber(0) {
        school = new char[strlen(s.school) + 1];
        strcpy_s(school, strlen(s.school) + 1, s.school);
        const_cast<int*>(this)->studentNumber = s.studentNumber;
        //studentNumber = s.studentNumber);
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用......我不确定这样做的语法是什么.

c++ const-cast

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

为什么(int&)0格式不正确?

根据[expr.cast]/4,C风格的强制转换按顺序尝试以下强制转换:

  1. const_cast
  2. static_cast
  3. static_cast 其次是 const_cast
  4. reinterpret_cast
  5. reinterpret_cast 其次是 const_cast

以下演员表格很好:

const_cast<int&>(static_cast<const int&>(0))
Run Code Online (Sandbox Code Playgroud)

然而,GCC和Clang都拒绝演员(int&)0.为什么?

c++ casting const-cast static-cast language-lawyer

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

如何在const函数中调用非const函数(C++)

我有一个看起来像这样的遗留函数:

int Random() const
{
  return var_ ? 4 : 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要在遗留代码中调用一个函数,以便它现在看起来像这样:

int Random() const
{
  return var_ ? newCall(4) : 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到了这个错误:

In member function 'virtual int Random() const':
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers
Run Code Online (Sandbox Code Playgroud)

现在我知道为了解决这个错误我可以使我newCall()的const函数.但后来我有几个newCall()函数调用,所以现在我必须使所有这些函数调用const.等等,直到最后我觉得我的程序的一半将是const.

我的问题:有没有办法在Random()中调用一个不是const的函数?或者有没有任何想法如何实现newCall()内部Random()而不使我的程序const的一半.

谢谢

-josh

c++ const function const-correctness const-cast

20
推荐指数
3
解决办法
3万
查看次数

我是否正确地说const_cast后面的ref-to-const绑定到临时修改是好的?

我想检查一下我对此事的理解和结论.


在IRC上,有人问:

绑定到临时对象const_castconst引用是否可以接受?

翻译:他有一个临时的ref-to-const,他想抛弃它const来修改它.

我的回答是我之前曾问过一个类似的问题,其中的共识似乎是临时性本身并不是天生的const,因此你可以抛弃const你对它们的引用的性质,并通过结果修改它们.而且,只要原始参考const仍然存在,这不会影响临时的生命周期.

那是:

int main()
{
   const int& x = int(3);

   int& y = const_cast<int&>(x);
   y = 4;

   cout << x;
}
// Output: 4
// ^ Legal and safe
Run Code Online (Sandbox Code Playgroud)

我对吗?


(当然,这些代码是否真的是可取的完全是另一回事!)

c++ const reference const-cast temporary-objects

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

如何将"指针指针类型"转换为const?

使用以下代码

void TestF(const double ** testv){;}
void callTest(){
    double** test;
    TestF(test);
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

'TestF' : cannot convert parameter 1 from 'double **' to 'const double **'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.为什么test不能默默地投入const double**?我为什么要明确地这样做?我知道

TestF(const_cast<const double**>(test)) 
Run Code Online (Sandbox Code Playgroud)

使我的代码正确,但我觉得这应该是不必要的.

是否有一些关于const的关键概念我不知道了?

c++ const const-cast

17
推荐指数
2
解决办法
2458
查看次数

将const char*转换为QString

我必须使用类型函数的输出,const char*我需要将其转换为QString.

注意:在该函数内部,这些是返回的代码行 const char*

char* ClassA::getData() const{
    return const_cast<char *> (_foo.c_str());
}
Run Code Online (Sandbox Code Playgroud)

哪里_foostd::string.

我尝试使用以下代码行但总是得到空字符串(实际上不是空的但只包含新的行字符而忽略所有其他字符).

QString foo1 = QString(temp.getData());
QString foo2 = QString::fromLocal8Bit(temp.getData());
QString foo3 = QString(QLatin1String(temp.getData()));
QString foo4 = QString::fromAscii(temp.getData());
QString foo5 = QString::fromUtf8(temp.getData());
Run Code Online (Sandbox Code Playgroud)

c++ qstring qt const-cast qtcore

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

C++:为什么const_cast是邪恶的?

我一直听到这句话,但我无法真正找到const_cast是邪恶的原因.

在以下示例中:

template <typename T>
void OscillatorToFieldTransformer<T>::setOscillator(const SysOscillatorBase<T> &src)
{
    oscillatorSrc = const_cast<SysOscillatorBase<T>*>(&src);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用引用,并使用const,我保护我的引用不被更改.另一方面,如果我不使用const_cast,代码将无法编译.为什么const_cast在这里不好?

这同样适用于以下示例:

template <typename T>
void SysSystemBase<T>::addOscillator(const SysOscillatorBase<T> &src)
{
    bool alreadyThere = 0;
    for(unsigned long i = 0; i < oscillators.size(); i++)
    {
        if(&src == oscillators[i])
        {
            alreadyThere = 1;
            break;
        }
    }
    if(!alreadyThere)
    {
        oscillators.push_back(const_cast<SysOscillatorBase<T>*>(&src));
    }
}
Run Code Online (Sandbox Code Playgroud)

请给我一些例子,我可以看到使用const_cast是一个坏主意/不专业.

谢谢你的任何努力:)

c++ pointers casting const const-cast

14
推荐指数
3
解决办法
9538
查看次数