相关疑难解决方法(0)

在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?

正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.

在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:

unsigned char x = 12;
{ unsigned char x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?

c++ undefined-behavior language-lawyer c++11 c++14

62
推荐指数
1
解决办法
3991
查看次数

初始化是否需要左值到右值的转换?是`int x = x;`UB?

C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":

int x = x;
Run Code Online (Sandbox Code Playgroud)

这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).

这实际上是未定义的行为吗?

根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?

c++ initialization undefined-behavior language-lawyer

55
推荐指数
2
解决办法
2411
查看次数

这种自我指派是否做了明智的事情?

我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?

char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)

编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.

c c++

20
推荐指数
3
解决办法
4070
查看次数

为什么在这个C++代码中i == 0的值?

我对以下代码感到困惑:

#include <iostream>

int i = 1;
int main()
{
    int i = i;
    std::cout << "i: " << i << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

i: 0
Run Code Online (Sandbox Code Playgroud)

我曾预计运行上面的代码会打印出来1.有人可以解释这种奇怪行为的原因吗?

c++ undefined-behavior

16
推荐指数
1
解决办法
1558
查看次数

使用GNU STL的GCC 4.8会为std :: string构造函数生成错误的代码吗?

所以有点C++代码:

void func( const std::string& theString )
{
    std::string theString( theString );
    theString += " more string";
    std::cout << theString;
}
Run Code Online (Sandbox Code Playgroud)

GCC 4.8和编译好VS 2013.根据我的C++知识,代码是可以的,一个局部变量theString被带入范围,然后隐藏theString在函数参数中.在theString构造点,唯一theString的范围是传递给std::string构造函数的函数参数.std::string然后命名构造theString,它进入范围并theString在代码中稍后使用.唷!

但是,GCC似乎theString传递给std::string构造函数的行为是本地theString(尚未构造)导致编译的程序崩溃.使用VS 2013,代码编译并运行良好.

所以,

  1. 我的代码是否正确?或者我在做一些超出规范的事情,这意味着GCC的行为是未定义的.
  2. 这是GCC中的错误吗?

c++ gcc stl undefined-behavior

13
推荐指数
2
解决办法
1486
查看次数

C++使用对正在定义的变量的引用

以下代码是否有效C++,根据标准(折扣... s)?

bool f(T& r)
{
    if(...)
    {
        r = ...;
        return true;
    }
    return false;
}

T x = (f(x) ? x : T());
Run Code Online (Sandbox Code Playgroud)

众所周知,在这个项目使用的GCC版本中编译(4.1.2和3.2.3 ...甚至没有让我开始...),但应该吗?

编辑:我添加了一些细节,例如f()概念在原始代码中的样子.基本上,它意味着在某些条件下初始化x.

c++ scope object-lifetime language-lawyer self-reference

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

为什么const类可以自己初始化?

今天我被一个非常愚蠢但很难被发现的bug所击中.这是相关代码:

class Vector;
class PointIterator {
  const Vector & x;
  const Vector & yv;

  PointIterator(const Vector & xv, const Vector & yvo) : 
    x(xv), yv(yv) { ;};
  //          ^^ here is wrong
};
Run Code Online (Sandbox Code Playgroud)

为什么这样的代码合法C++?有没有可以使用yv变量的情况?我知道类似的问题int x = x+1;,(参见这个问题),但后者没有正确初始化,你仍然可以使用x变量,而在上面的代码中,我认为你不能使用yv.

加分点:是否有任何编译选项可以让我发现这个?(最好使用gcc,但我也使用clang),除了"未使用的参数"警告(我有很多这些,我知道我应该清理它们).

c++

4
推荐指数
1
解决办法
195
查看次数

为什么捕获 lambda 在 C++ 中不起作用?

我正在使用 C++ 中的 lambda 表达式,我尝试了一些方法来查看结果。我实际上在 CppCon Back to Basics: Lambdas from Scratch - Arthur O'Dwyer - CppCon 2019 @21:47 中观看了视频并开始使用 lambdas。

举个例子,我试过这个:

#include <iostream>
using namespace std;
int g = 10;//global var 'g'

//creating lambda
auto kitten = [=] () {return g+1;};
auto cat = [g=g] () {return g+1;};
// main
int main()
{
    g = 20;//modifying global variable 'g'
    cout<<"kitten: "<<kitten()<<"cat: "<<cat()<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是:

kitten: 21cat: 11
Run Code Online (Sandbox Code Playgroud)

在上面的例子中:[g=g]表示捕获一个名称g和类型与外部相同的数据成员g,就像我写的一样auto g=g。这是一个副本 …

c++ lambda std capture c++11

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

是 int x = x; 在 C++ 中定义良好?

我有以下代码:

// in global scope:
int x = x;
Run Code Online (Sandbox Code Playgroud)

此代码编译时不会对 GCC 和 clang发出警告:

x:
  .zero   4
Run Code Online (Sandbox Code Playgroud)

这是明确定义的吗?它是如何工作的?

c++ initialization global-variables language-lawyer

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

用自己初始化一个字符串(C++)

下面的代码在Linux(g ++ 4.8.4)和Windows(VS Express 2013)上编译,但在执行时会产生不同的结果.

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string str = str;
    cout << "'str.length()': "
         << str.length() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Linux上我得到:

'str.length()': 140187593065792
Run Code Online (Sandbox Code Playgroud)

在Windows上,我得到:

'str.length()': 0
Run Code Online (Sandbox Code Playgroud)

另外,如果我更改了如下所示的初始化语句,那么它符合但它在运行时崩溃(在Linux上我得到:在抛出'std :: bad_alloc'的实例后调用terminate):

string str = str + str;
Run Code Online (Sandbox Code Playgroud)

我理解,在这两种情况下,这不是初始化字符串变量的常用方法.但是,有人可以解释这段代码的真正错误吗?另外,为什么第一种情况下输出不同?

c++ string

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