我找不到太多的信息const_cast
.我能找到的唯一信息(在Stack Overflow上)是:
将
const_cast<>()
用于添加/删除变量的常量(岬)(或挥发性岬).
这让我很紧张.可能const_cast
会导致意外行为?如果是这样,什么?
或者,什么时候可以使用const_cast
?
作为一个通用规则,const_cast<>()
在C++代码中使用它通常被认为是一种不好的做法,因为它(大多数情况下)揭示了设计中的一个缺陷.
虽然我完全同意这种说法,但是我不知道什么是例使用const_cast<>()
是确定和唯一的解决办法.
你能不能给我一些你认识/遇到过的例子?
非常感谢你.
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) 我的类中有一个私有变量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)
这不起作用......我不确定这样做的语法是什么.
根据[expr.cast]/4,C风格的强制转换按顺序尝试以下强制转换:
const_cast
static_cast
static_cast
其次是 const_cast
reinterpret_cast
reinterpret_cast
其次是 const_cast
以下演员表格很好:
const_cast<int&>(static_cast<const int&>(0))
Run Code Online (Sandbox Code Playgroud)
然而,GCC和Clang都拒绝演员(int&)0
.为什么?
我有一个看起来像这样的遗留函数:
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
我想检查一下我对此事的理解和结论.
在IRC上,有人问:
绑定到临时对象
const_cast
的const
引用是否可以接受?
翻译:他有一个临时的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)
我对吗?
(当然,这些代码是否真的是可取的完全是另一回事!)
使用以下代码
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的关键概念我不知道了?
我必须使用类型函数的输出,const char*
我需要将其转换为QString
.
注意:在该函数内部,这些是返回的代码行 const char*
char* ClassA::getData() const{
return const_cast<char *> (_foo.c_str());
}
Run Code Online (Sandbox Code Playgroud)
哪里_foo
是std::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) 我一直听到这句话,但我无法真正找到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++ ×10
const-cast ×10
const ×5
casting ×3
function ×1
immutability ×1
pointers ×1
qstring ×1
qt ×1
qtcore ×1
reference ×1
static-cast ×1