我使用的是intel c ++编译器icc版本18.0.3.
如果我编译下面的代码与-w3
#include <vector>
int main() {
std::vector<int> vec;
vec.push_back(2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test_w3.cpp(6):备注#383:复制到临时值,引用临时使用的vec.push_back(2);
更换的2与一个常量变量作为
#include <vector>
int main() {
std::vector<int> vec;
const int a = 2;
vec.push_back(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有发出警告.
这个警告意味着什么?可以安全地忽略它(尽管需要无警告代码)吗?
std::string &func(int vlu)
{
std::string str;
str = std::to_string(vlu) + "something";
return str;
}
Run Code Online (Sandbox Code Playgroud)
上述功能明显不安全.
以下是另一个版本.
std::string &func(int vlu)
{
return std::to_string(vlu) + "something";
}
Run Code Online (Sandbox Code Playgroud)
我有一些问题:
第二个版本的编译器(gcc)没有给我任何警告.安全吗?我只是认为编译器(或其他什么?)将创建一个临时变量来保存表达式的返回std::to_string(vlu) + "something".所以第二个版本也不安全.我说对了?
我惊讶地发现这段代码编译:
#include <functional>
struct Callable {
void operator() () { count++; }
void operator() () const = delete;
int count = 0;
};
int main() {
const Callable counter;
// counter(); //error: use of deleted function 'void Callable::operator()() const'
std::function<void(void)> f = counter;
f();
const auto cf = f;
cf();
}
Run Code Online (Sandbox Code Playgroud)
https://wandbox.org/permlink/FH3PoiYewklxmiXl
这将调用非const调用运算符Callable.相比之下,如果你这样做,const auto cf = counter; cf();它会按预期出错.那么,为什么const正确性似乎没有被遵循std::function?
我读到这个和这个.如果通过包含fenv.h生成nan并且启用所有浮点异常,则可以抛出SIGFPE,但是FE_INEXACT通过feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
因此,代码改变了形式
int main () {
double dirty = 0.0;
double nanvalue = 0.0/dirty;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
至
#include <fenv.h>
int main () {
feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT); // Enable all floating point exceptions but FE_INEXACT
double dirty = 0.0;
double nanvalue = 0.0/dirty;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但您必须更改代码.我有问题,在一个巨大的c和c ++代码库中,某个地方生成了一个nan,我不知道在哪里.将上述更改应用于文件的hunderts并跟踪错误不是一种选择.
有没有办法在没有代码更改的情况下启用所有浮点异常?有没有我不知道的编译选项?
我们使用intel icc 15.0.3版编译器.
如果我尝试访问std::vector越界,将导致未定义的行为.
const std::vector<int> vec {1,2,3};
const int a = vec[4];
Run Code Online (Sandbox Code Playgroud)
然而,这段代码可能不会立即失败,但a会有一个任意值;
如果vec通过该方法访问,.at()则将抛出异常.
const int a = vec.at(4);
Run Code Online (Sandbox Code Playgroud)
缺点是,如果.at()总是使用,性能将显着下降.
我的问题是,如果某些C++编译器支持编译标志,则会切换operator []到该.at()方法.
将其打开可以获得良好的可调试代码.将其关闭会导致快速发布可执行文件.
我知道堆检查工具,比如valgrind会发现这些bug,但是它们需要花费很多时间.
我可以基于“不匹配” Catch2中的特定标签来运行测试用例吗?
TEST_CASE("Check the data validity","[Working]"){
REQUIRE(true);
}
TEST_CASE("Check the input","[InProgress]"){
REQUIRE(true);
}
TEST_CASE("Validate the response","[NotWorking]"){
REQUIRE(false);
}
Run Code Online (Sandbox Code Playgroud)
在[NotWorking]完成实现该功能之前,我想调用不属于标签的测试用例。
我们的存储库的根文件夹中有一个自定义文件,并对所有C++ 文件.clang-format使用 clang-format 。-style=fileC
我喜欢只更改一个文件的 clang-format 格式规则。我特别喜欢将BinPackArguments形式切换true到false.
我知道,我可以将.clang-format文件放在相应的文件夹中。该选项会影响该文件夹中的所有文件。
一次以不同的方式格式化它不是一个选项,因为我们的版本控制系统将拒绝未格式化的文件。
我知道,我可以通过评论关闭格式化程序
// clang-format off
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是文件根本没有格式化。
有没有一种方法可以仅更改一个文件的一个选项(也许通过评论)?
我想找到长矢量的最小值和最大值.以下代码有效,但我需要遍历向量两次.
我可以使用一个老式的for循环,但我想知道是否有一种优雅的(c ++ 11,std)方式.
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char** argv) {
vector<double> C;
// code to insert values in C not shown here
const double cLower = *min_element(C.begin(), C.end());
const double cUpper = *max_element(C.begin(), C.end());
// code using cLower and cUpper
}
Run Code Online (Sandbox Code Playgroud) 考虑以下计划:
#include <string>
#include <iostream>
class B {
private:
std::string s;
public:
B() { s = fun(); }
std::string fun() { return "hello"; }
void print() {
std::cout << s;
}
};
int main(){
B b;
b.print();
}
Run Code Online (Sandbox Code Playgroud)
输出是 Hello
我的问题是:
我怀疑的是我如何在b对象上调用一个尚未由构造函数创建的函数.
我试着理解缓冲区溢出.这是我的代码:
#include <stdio.h>
int main()
{
char buf[5] = { 0 };
char x = 'u';
printf("Please enter your name: ");
gets(buf);
printf("Hello %s!", buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该buf数组的大小为5,并使用0es初始化.所以(使用null终止)我有四个字符的空间.如果我输入五个字符(例如堆栈),我会覆盖空终止字符并printf打印"Hello stacku!" 因为后续的变量x.但事实并非如此.它只是打印"堆栈".有人可以解释一下原因吗?