小编sch*_*312的帖子

在警告级别为3的int的std :: vector push_back中编译器警告

我使用的是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)

没有发出警告.

这个警告意味着什么?可以安全地忽略它(尽管需要无警告代码)吗?

c++ vector compiler-warnings

7
推荐指数
1
解决办法
228
查看次数

C++返回一个std :: string&

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".所以第二个版本也不安全.我说对了?

c++ gcc reference c++11 dangling-pointer

7
推荐指数
1
解决办法
753
查看次数

没有遵循std :: function const的正确性

我惊讶地发现这段代码编译:

#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

c++ const std-function

7
推荐指数
1
解决办法
425
查看次数

在没有代码更改的情况下生成NaN浮点数时停止调试器

我读到这个这个.如果通过包含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版编译器.

c c++ nan sigfpe

6
推荐指数
1
解决办法
216
查看次数

在调试模式下,对std :: vector使用`.at()`而不是operator` []`

如果我尝试访问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,但是它们需要花费很多时间.

c++ vector stdvector operator-keyword

5
推荐指数
0
解决办法
118
查看次数

运行单元测试,但不包括Catch2中的特定标签

我可以基于“不匹配” 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++ catch2

5
推荐指数
1
解决办法
411
查看次数

clang-format 仅更改一个文件中的一种格式选项

我们的存储库的根文件夹中有一个自定义文件,并对所有C++ 文件.clang-format使用 clang-format 。-style=fileC

我喜欢只更改一个文件的 clang-format 格式规则。我特别喜欢将BinPackArguments形式切换truefalse.

我知道,我可以将.clang-format文件放在相应的文件夹中。该选项会影响该文件夹中的所有文件。

一次以不同的方式格式化它不是一个选项,因为我们的版本控制系统将拒绝未格式化的文件。

我知道,我可以通过评论关闭格式化程序

// clang-format off
Run Code Online (Sandbox Code Playgroud)

这样做的缺点是文件根本没有格式化。

有没有一种方法可以仅更改一个文件的一个选项(也许通过评论)?

c++ customization clang-format

5
推荐指数
0
解决办法
654
查看次数

找到长矢量的最小值和最大值

我想找到长矢量的最小值和最大值.以下代码有效,但我需要遍历向量两次.

我可以使用一个老式的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)

c++ algorithm element min

3
推荐指数
1
解决办法
99
查看次数

如何为c ++程序分配内存

考虑以下计划:

#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

我的问题是:

  1. 在哪个序列中为数据成员分配内存(在本例中为's').
  2. 在构造函数中调用fun()时是否存在Object.

我怀疑的是我如何在b对象上调用一个尚未由构造函数创建的函数.

c++

3
推荐指数
1
解决办法
135
查看次数

C缓冲区溢出的说明

我试着理解缓冲区溢出.这是我的代码:

#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.但事实并非如此.它只是打印"堆栈".有人可以解释一下原因吗?

c buffer-overflow

3
推荐指数
2
解决办法
253
查看次数