我知道编码风格会很糟糕,但是下面的代码在我的机器上运行得很好.但这种行为是否定义明确?便携式?
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) 问题:被忽略的返回值是立即破坏还是在超出范围时被破坏.
下面的代码返回我的编译器
输出:
是谁,不需要它.
谁买它,没用它.
谁使用它既不能看到也不能感受到它.
它是什么?
因此,忽略的值立即被破坏.但这个编译器是特定的还是标准行为?
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) 换句话说是以下代码声音(定义的行为,便携式,...)
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) 在多重继承的情况下,是否很好地定义了破坏的顺序?
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),我得到不同的结果.订单定义明确吗?如果是这样,订购规则是什么?
我对以下代码段有疑问:
long l=9223372036854775807L;
float f=static_cast<float>(l);
Run Code Online (Sandbox Code Playgroud)
根据IEEE754,不能完全表示long值。
我的问题是如何处理有损转换:
我知道这个问题 ,将int转换为float时在后台会发生什么,但这不会解决我的问题。
我发现没有更好的方法可以像这样制定我的问题:下面的输出总是正确吗?这便携式吗?
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) 问: 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++ 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表达式)
要以下代码:
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)
我有一些问题:
在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失去作用,或者我错了吗?