我遇到了一个奇怪的问题,它只在Release模式下显示,但在Debug模式下没有(使用VS2015 RC)。 Aggregate
的第二个类成员使用与第一个相同的值进行初始化,即使它应该默认初始化。
更奇怪的是,一旦我将Base() = default;
更改为Base() {};
,奇怪的行为便消失了。但它们应该是等价的,不应该吗?我找到了VS错误吗?
我能够把它归结为:
#include <iostream>
#include <vector>
#include <random>
using namespace std;
class Base {
public:
Base() = default; // elicits the odd behaviour on VS Release mode
//Base() {}; // works
Base(std::vector<int> m) : m(m) {};
size_t get_m() const { return m.size(); };
private:
std::vector<int> m;
std::mt19937 engine;
};
class Aggregate {
public:
Aggregate() = default;
Aggregate(Base one, Base two) : one(one), two(two) {};
Base get_one() const { return one; };
Base get_two() const { return two; };
private:
Base one;
Base two;
};
Aggregate make_aggregate() {
Base b1(std::vector<int> { 1, 2 });
Base b2(std::vector<int> { 3, 4, 5});
return Aggregate(b1, b2);
};
int main() {
Aggregate a1 = make_aggregate();
Base base = Base();
Aggregate a2(a1.get_one(), base); // a2.two.m should be empty and it is
Aggregate a3(a1.get_one(), Base()); // a2.two.m should be empty but it's set to a2.one.m
// should print '2, 0', and it does:
cout << a2.get_one().get_m() << ", " << a2.get_two().get_m() << endl;
// prints '2, 2' on VS in Release mode! (and '2, 0' in Debug mode, and on clang):
cout << a3.get_one().get_m() << ", " << a3.get_two().get_m() << endl;
}
我是否处于未定义行为的境地(例如,mt19937
必须静态吗?)或我的代码是否正常?这是一个VS bug吗?使用和不使用clang-3.5
的代码-g
都没问题。