我正在从Stroustrup的《使用C ++编程原理和实践》第二版中学习C ++。
以下代码段:
#include "include/std_lib_facilities.h"
int main() {
vector<int> v = { 5, 7, 9, 4, 6, 8 };
vector<string> philosopher = { "Kant", "Plato", "Hume", "Kierkegaard" };
philosopher[2] = 99; // compile-time error should be here, too
v[2] = "Hume"; // compile-time error presented here as it should
vector<int> vi(6);
vector<string> vs(4);
vi[20000] = 44; // run-time error, but not compile-time error
cout << "vi.size() == " << vi.size() << '\n';
return 0;
}
仅给出此编译时错误:
clang++ -std=c++1z -g -Weverything -Werror -Wno-c++98-compat -Wno-c++98-compat-pedantic -Ofast -march=native -ffast-math src/055_vector.cpp -o bin/055_vector
src/055_vector.cpp:11:7: error: assigning to 'int' from incompatible type 'const char [5]'
v[2] = "Hume"; // compile-time error presented here as it should
^ ~~~~~~
1 error generated.
我使用
-std=c++1z -g -Weverything -Werror -Wno-c++98-compat -Wno-c++98-compat-pedantic
命令启用了错误检查。但是正如您看到的那样,这些行并没有给出错误,而是根据本书,它们也应该像v[2] = "Hume";
一样:philosopher[2] = 99;
vi[20000] = 44;
如果我从第一个控制台输出中注释掉
v[2] = "Hume";
错误行,而仅使用vi[20000] = 44;
行进行编译,则更糟糕的是,它可以毫无问题地进行编译,但是当我尝试运行该程序之后:This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'Range_error'
what(): Range error: 20000
如何捕获向量中不存在的元素,以及如果我尝试将字符串分配给向量中的int?看起来
-Weverything
不包括此内容。在clang中是否有针对这种情况的更严格的隐藏标志,在
-Weverything
下没有隐藏? 最佳答案
philosopher[2] = 99;
是合法代码,它使字符串为1个字符的字符串,并且字符的代码为99。(可能是'c'
)。这似乎不直观,但是std::string
是几十年前设计的,现在如果不破坏现有代码就不能更改它。
该标准没有为vi[20000] = 44;
指定任何必需的诊断。这是运行时未定义的行为;如果执行从未达到那条线,那将不是错误。
要捕获运行时错误,有一些选项,例如在调试器中运行,或使用clang的地址清理器或valgrind。
关于c++ - 带有-Weverything标志的clang不捕获 vector 中不存在的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42297145/