根据我的理解,const修饰符应该从右到左阅读.从那以后,我明白了:
const char*
Run Code Online (Sandbox Code Playgroud)
是一个指针,其char元素不能被修改,但指针本身可以,和
char const*
Run Code Online (Sandbox Code Playgroud)
是一个指向mutable字符的常量指针.
但是我得到以下代码的以下错误:
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
Run Code Online (Sandbox Code Playgroud)
那么是哪一个呢?我的理解还是我的编译器(VS 2005)错了?
我有:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
Run Code Online (Sandbox Code Playgroud)
错误: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
在C++风格中投射的正确方法是什么?
我知道它提高了可读性并使程序不易出错,但它提高了多少性能?
在旁注中,参考和const指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但是如何呢?
我是ECMAScript 6的新手,在尝试学习Ember时,我偶尔会看到以下代码风格:
const {
abc,
def
} = Object;
Run Code Online (Sandbox Code Playgroud)
我搜索了谷歌和许多网站,解释了新的ES6规范.我知道这不是当前的实现,因为我输入时我的控制台出错了.
这段代码是什么意思?
UPDATE
我将这个片段粘贴到Babel的转换器中,这就是它返回的内容:
"use strict";
var abc = Object.abc;
var def = Object.def;
Run Code Online (Sandbox Code Playgroud)
我仍然对这是想要实现的目标感到困惑.
我已经多次听过和读过,最好将异常作为引用而不是引用来引用.为什么是
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
比...更好
try {
// stuff
} catch (std::exception& e) {
// stuff
}
Run Code Online (Sandbox Code Playgroud) 我认为问题很清楚.将auto关键字自动检测常量性,或总是返回一个非const类型,即使有如.函数的两个版本(一个返回const,另一个不返回).
仅仅为了记录,我确实const auto end = some_container.end()在我的for循环之前使用,但我不知道这是否必要或甚至与正常情况不同auto.
当我遇到计算立方体体积的函数时,我正在阅读我的C++书籍(Deitel).代码如下:
double cube (const double side){
return side * side * side;
}
Run Code Online (Sandbox Code Playgroud)
使用"const"限定符的解释是这样的:"const限定应该用于强制执行最小特权原则,告诉编译器函数不修改变量端".
我的问题:这里不是使用"const"冗余/不必要的,因为变量是通过值传递的,所以函数无论如何都不能修改它?
我猜不是,但我想证实一下.是否有用const Foo&&,Foo哪种类型?
以下两个(或两个/两个)代码片段中的哪一个应该在完整的ECMAScript 2015实现中工作:
for (const e of a)
for (const i = 0; i < a.length; i += 1)
根据我的理解,第一个例子应该有效,因为e每次迭代都会初始化.i在第二个版本中是否也应该如此?
我很困惑,因为现有的实现(Babel,IE,Firefox,Chrome,ESLint)似乎并不一致,并且具有const两种循环变体的各种行为的完整实现; 我也无法在标准中找到具体的观点,因此我将非常感激.
请考虑以下示例:
#include <cstdlib>
int main() {
const int m = 42;
[] { m; }(); // OK
const int n = std::rand();
[] { n; }(); // error: 'n' is not captured
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要捕获n第二个lambda而不是m第一个lambda?我在C++ 14标准中检查了第5.1.2节(Lambda表达式)但我无法找到原因.你能指点我解释一个段落吗?
更新:我在GCC 6.3.1和7(主干)中观察到了这种行为.Clang 4.0和5(主干)在两种情况下都失败并出错(variable 'm' cannot be implicitly captured in a lambda with no capture-default specified).