C ++中的struct,可以用0初始化,但不能用另一个int初始化

时间:2018-03-06 08:20:38

标签: c++

的伪代码:

struct Time {
    // constructor from zero
    constexpr T(const int i)
        : m_(i) {
            static_assert(i == 0, "Can only construct from zero");
        }

    // other constructors from seconds, microseconds, etc.

    int m_{};
};

int main() {
    T t1(0); // correct
    T t2(1); // incorrect

    return 0;
}

这不是正确的代码(static_assert在编译时{(1}})无法使用非常量编译。它可以用任何其他方式编写吗?

UPD。我知道默认构造函数。这个问题是:在C ++中是否可以静态检查构造函数中的参数。

3 个答案:

答案 0 :(得分:4)

您可以使用std::integral_constant

struct S {
    constexpr S(std::integral_constant<int, 0> i)
        : m_(i) {
            static_assert(i == 0, "Can only construct from zero");
        }

    int m_{};
};

int main() {
    S t1(std::integral_constant<int, 0>{}); // correct
    //S t2(std::integral_constant<int, 1>{}); // incorrect
}

但是作为评论中的状态,为什么让事情变得复杂,而你可以简单地将你的成员初始化为0而没有那个参数。

答案 1 :(得分:3)

您可以使用decltype(nullptr)(又名std::nullptr_t):

#include <iostream>

struct Time
{
    constexpr Time(decltype(nullptr)) {}

    int m_{};
};

int main() {
    Time t1(0);
    Time t2(1); // error: no matching constructor for initialization of 'Time'

    return 0;
}

请注意,此技巧不允许您执行int x = 0; Time t1(x);

答案 2 :(得分:2)

只需将其指定为零?

struct Time {
    // constructor from zero
    constexpr T(int i) //ignored
        : m_(0) {}    
}