小编use*_*183的帖子

运算符[]的负指数是否定义明确?

我知道编码风格会很糟糕,但是下面的代码在我的机器上运行得很好.但这种行为是否定义明确?便携式?

int main()
{
    int *p = new int[3];
    int *q = &p[2];
    q[-1] = 41;
    std::cout << p[1];
    delete[] p;
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading language-lawyer

40
推荐指数
3
解决办法
2480
查看次数

C++:被忽略的返回值破坏行为是明确定义的

问题:被忽略的返回值是立即破坏还是在超出范围时被破坏.

下面的代码返回我的编译器

输出:

是谁,不需要它.

谁买它,没用它.

谁使用它既不能看到也不能感受到它.

它是什么?

因此,忽略的值立即被破坏.但这个编译器是特定的还是标准行为?

struct foo
{
   ~foo()
   {
      std::cout << "Who makes it, has no need of it. \n"
                << "Who buys it, has no use for it. \n";
   }
}

foo createFoo()
{
   return foo();
}

int main(int argc, char* argv[])
{
     createFoo();
     std::cout << "Who uses it can neither see nor feel it.\n"
               << "What is it?"; 
}
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

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

移动其内容后调用vector.resize(0)是否安全

换句话说是以下代码声音(定义的行为,便携式,...)

   std::vector<int> vec(100,42);
   std::vector<int> other = std::move(vec);
   vec.resize(0);//is this sound

   //using vec like an empty vector
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

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

多重继承的情况下的破坏顺序

在多重继承的情况下,是否很好地定义了破坏的顺序?

struct A
{
   ~A(){std::cout << "A\n";}   
};

struct B
{
   ~B(){std::cout << "B\n";}   
};

struct AB : public B, public A
{
    ~AB(){std::cout<<"AB\n";}   
};

int main()
{
    AB ab;
}
Run Code Online (Sandbox Code Playgroud)

对于给定的代码,我的编译器打印:

AB
B
A
Run Code Online (Sandbox Code Playgroud)

但我使用更复杂的结构(包括CWinApp),我得到不同的结果.订单定义明确吗?如果是这样,订购规则是什么?

c++ multiple-inheritance language-lawyer

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

在C ++中如何定义从整数到浮点的精度损失?

我对以下代码段有疑问:

long l=9223372036854775807L;
float f=static_cast<float>(l);
Run Code Online (Sandbox Code Playgroud)

根据IEEE754,不能完全表示long值。

我的问题是如何处理有损转换:

  1. 是否采用最近的浮点表示形式?
  2. 是否会采用下一个较小/较大的表示形式?
  3. 还是采用其他方法?

我知道这个问题 ,将int转换为float时在后台会发生什么,但这不会解决我的问题。

c++ floating-point rounding static-cast

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

c ++:数组中的类成员有多远(以字节为单位)?

我发现没有更好的方法可以像这样制定我的问题:下面的输出总是正确吗?这便携式吗?

struct Point
{
    int x;
    int y;
};

//...
std::vector<Point> points(3);
unsigned char* start = (unsigned char*)(&points[0]);
unsigned char* end = (unsigned char*)(&points[1]); 

std::cout << "is this the same ? " << std::distance(start,end) == sizeof(Point);
Run Code Online (Sandbox Code Playgroud)

如果不是a vector,points被定义为原始数组怎么办?输出仍然是真的吗?

Point *points = new Point[3]; // instead of std::vector<Point> points(3);
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

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

DBL_MIN是最小的正双倍?

问: DBL_MIN是最小的正双倍?

下面的代码似乎没有提出这个问题.但如果这是真的,那么如何定义DBL_MIN以及它的用途或目的是什么.

平台:Windows7和Visual Studio 2013

double next_to_zero = std::nextafter(0.0,DBL_MIN);
bool b =  DBL_MIN <= next_to_zero;
std::cout << std::boolalpha 
          << "is dbl_min the smallest representable double? "
          << b << '\n';

std::cout << std::setprecision(56)
          << "dbl_min = " << DBL_MIN << '\n'
          << "next to zero = " << next_to_zero;
Run Code Online (Sandbox Code Playgroud)

输出:

dbl_min是最小的可表示的双倍?假

dbl_min = 2.2250738585072013830902327173324040642192159804623318306e-308

零旁边= 4.9406564584124654417656879286822137236505980261432476443e-324

c++ numeric language-lawyer

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

将函数转发到c ++ 11中的lambda表达式

对于C++ 11中的Packaged_Task实现,我希望实现我在下面的C++ 14代码中所表达的内容.换句话说,我想转发一个lambda表达式.

template<class F>
Packaged_Task(F&& f) {
    Promise<R> p;
    _future = p.get_future();

     auto f_holder = [f = std::forward<F>(f)]() mutable { return std::move(f); };
 ///...
Run Code Online (Sandbox Code Playgroud)

我知道移植到lambda的变通方法(但不幸的是这个变通方法需要一个默认的可构造对象,在我的例子中,对象通常是没有default-constructor的lambda表达式)

c++ lambda c++11

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

迈耶斯单身人士的破坏秩序

要以下代码:

class C {
public:    
    static C& Instance() {
       static C c;
       return c;
    }

   ~C(){std::cout << "c destructed\n";}
private:
   C(){}
};

class D{//similar to C but prints `d destructed` on destruction
//...

int main()
{
    auto c = C::Instance();
    auto d = D::Instance();
}
//outputs (with gcc)
//d destructed
//c destructed
//d destructed
//c destructed
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  1. 破坏的顺序是否定义明确?(即使C类和D类在不同的源文件中定义)
  2. 如果它被明确定义,这种行为是否可移植?

c++ language-lawyer

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

在C ++中是否转换为simd类型的未定义行为?

在simd教程中,我找到了以下代码片段。

void simd(float* a, int N)                                                                                                                                                                                        
{                      
// We assume N % 4 == 0.                                                                                                                                                                                        
 int nb_iters = N / 4;                                                                                                                                                                                         
 __m128* ptr = reinterpret_cast<__m128*>(a); // (*)                                                                                                                                                                                 

 for (int i = 0; i < nb_iters; ++i, ++ptr, a += 4)                                                                                                                                                              
     _mm_store_ps(a, _mm_sqrt_ps(*ptr));                                                                                                                                                                          
}   
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,带有(*)未定义行为的行吗?由于来自(https://en.cppreference.com/w/cpp/language/reinterpret_cast)的以下规范

每当尝试通过AliasedType类型的glvalue读取或修改DynamicType类型的对象的存储值时,除非满足以下条件之一,否则行为是不确定的:

  • AliasedType和DynamicType相似。
  • AliasedType是DynamicType的(可能是cv限定的)带符号或无符号的变体。
  • AliasedType是std :: byte,(从C ++ 17开始)char或unsigned char:这允许将任何对象的对象表示形式检查为字节数组。

在这种情况下,有人如何防止未定义的行为?我知道我可以std :: memcopy,但是性能下降会使simd失去作用,或者我错了吗?

c++ sse simd intrinsics undefined-behavior

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