- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据标准 (§5.2.11),const_cast 会丢弃 cv 限定符(const 或 volatile)。
这是一个简单的例子。首先你声明两个函数接受一个指针和一个引用:
class Bar { ... };
void foo_ptr(Bar*);
void foo_ref(Bar&);
然后你创建一个常量引用:
Bar b;
const Bar& cb = b;
然后您可以使用适当的 const_cast 调用任一函数:
foo_ptr(const_cast<Bar*>(&cb));
foo_ref(const_cast<Bar&>(cb));
这是我的问题:既然 const_cast 不能做其他类型转换的设计目的,那么您要转换成什么不是很明显吗?换句话说,为什么语言不允许我简单地说:
foo_ptr(const_cast<>(&cb));
foo_ref(const_cast<>(cb));
我能想到的只有以下两个原因:
a) 当我试图做一些疯狂的事情时,编译器应该阻止我,比如:
foo_ptr(const_cast<int*>(&cb));
foo_ref(const_cast<int&>(cb));
并且通过强制我明确声明我要转换到它的类型可以防止我行为不端。我发现这个(假设的)解释很薄弱,因为如果这种语言允许我写下一些错误的东西只是为了让编译器纠正我,那就太奇怪了。
b) 如果变量既是 const 又是 volatile,则可能存在歧义。在那种情况下,编译器将无法判断我是否试图抛弃其中一个或另一个(或两者)。
是这个原因,还是另有原因?
最佳答案
const_cast
可用于添加或删除 const
和 volatile
预选赛。因此,如果允许这样的语法,则以下所有内容都是 const_cast<>(&cb)
的合法目标类型:
Bar* (1)
const Bar* (2)
volatile Bar* (3)
const volatile Bar* (4)
您打算(1)。 (2) 通常是愚蠢的,但可以想象它可能出现在某个地方,也许在某些模板代码中。 (3) 和 (4) 确实是问题所在:您可以删除 const
资格并添加volatile
资格全部由一个类型转换完成。
您可以替换现有的 const_cast
一对石膏,const_cast
和 volatile_cast
,并禁止案例(2);那么你可以在没有目标类型的情况下使用它们中的任何一个。然而,这样就更难知道强制转换表达式的类型了。要知道强制转换表达式是添加还是删除限定条件,您必须知道源表达式的类型。
没有理由不使用函数模板来获得您想要的:
template <typename T>
T* remove_const(const T* p) {
return const_cast<T*>(p);
}
您可以轻松地为 remove_volatile
编写类似的函数和 add_const
和 add_volatile
, 它们都是隐式的。
关于c++ - 为什么 const_cast 需要说明你要转换到什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383766/
我正在阅读 C++ Primer,我发现了一些非常奇怪且难以理解的东西: Record lookup(Account&); //Record and Account are two unrelate
我的问题是,为什么代码的第一部分不起作用而第二部分有效。非常量指针应该修改之前使用 const_cast 的 const 值,但是对于整数这个技巧不起作用。您能解释一下为什么会这样吗? const i
我已经阅读了很多关于 C++ 中的 const_cast 被认为是错误和危险的讨论,除了向后兼容 C 代码之外,不应将其用于任何其他用途。我大体上同意。 但是最近我遇到了以下用例,这让我感到好奇。 我
C++ Primer 一书的第 6.4 章陈述如下: In § 4.11.3 (p. 163) we noted that const_casts are more useful in the con
我看到这个 post这解释了const_cast<>并说使用指针/引用是有益的。但是,请考虑以下代码: 1- const_cast(xadj) 我得到 invalid const_cast from
我正在阅读有关 c++ 中的 const_cast 运算符 1.我无法理解的第一件奇怪的事情是 const_cast 运算符语法即 -const_cast----(--expression--)---
这个问题在这里已经有了答案: const_cast doesn't work c++? [duplicate] (3 个答案) 关闭 6 年前。 在const_cast之后,main函数中的值没有变
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 我有以下代码: int main(){
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 #include using nam
我想使用 C++ 格式进行此转换,它以 C 方式工作。但是当我尝试使用 C++ 格式时它失败了。 有效! void req_password(const void *data, size_t data
我有一个管理输入的类。要显示和更改键绑定(bind),重要的是在完成后将其提交给管理器之前,为调用者提供它可以拥有和更改的绑定(bind)的映射。但是,这个映射中可以插入/删除什么的具体规则只有管理者
我对 const_cast 的返回类型有点困惑?尖括号内的类型是否 <>是返回类型吗? const int i = 5; int b = const_cast(i); 是const_cast返回 in
我有一个函数 static bool Validate(const char& letter, string& aWord) 我需要调用它 Validate(letter, aWord); // wh
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 考虑以下代码: 我声明了一个新的引用端
我有一个大型库,它实现了一些不可变的数据结构。可以想象,其中几乎所有内容都是 const合格的。有一些选择部分不是 const,例如引用计数器。为了处理嵌入结构中的引用计数器,这些引用计数器只能通过
长话短说是否适用于: mapm; m.insert( make_pair( 1, 40 ) ); for( map::iterator it = m.begin(); it !
据我所知,在类中创建常量函数对于读/写编译器优化很有用。 类中的常量函数意味着类成员在函数执行期间将保持不变。但是,您可以通过 const 强制转换隐式参数来绕过此问题(当然,这是一种非常糟糕的做法)
这个问题在这里已经有了答案: Two different values at the same memory address (7 个答案) 关闭 5 年前。 考虑以下代码: 我声明了一个新的引用端
考虑以下 C++03 程序: #include struct T { mutable int x; T() : x(0) {} }; void bar(int& x) { x
我正在查看我即将开始使用的 API 的一些示例代码。以下模式让我有点困惑: char* str; str = const_cast("Hello World"); printf("%s ", str)
我是一名优秀的程序员,十分优秀!