小编Ami*_*rsh的帖子

继承私有构造函数

试图允许make_unique使用私有 ctor 的类时,我发现两种情况之间存在以下奇怪的区别:


案例 1 - 空 ctor -编译

class A {
    int _i;
    A(): _i(7) {}
public:
    template<typename... T>
    static std::unique_ptr<A> create(T&&... t) {
        struct enablePrivateCtor : public A {
            using A::A;
        };
        return std::make_unique<enablePrivateCtor>(std::forward<T>(t)...);
    }
    void doIt() const {
        std::cout << _i << std::endl;
    }
};

int main() {
    auto a = A::create();
    a->doIt();
}
Run Code Online (Sandbox Code Playgroud)

输出:

7
Run Code Online (Sandbox Code Playgroud)

案例 2 - 非空构造函数-不编译

class A {
    int _i;
    A(int i): _i(i) {} // <- …
Run Code Online (Sandbox Code Playgroud)

c++ constructor c++11

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

一个带有漂亮计数器成语的错误还是一个格式错误的静态订单惨败?

以下代码在使用 clang(x86_64-pc-linux-gnu 上的 5.0.0-3~16.04.1 版)时崩溃,但与 gcc (9.2.0) 一起工作正常。

struct Registry {
    static int registerType(int type) {
        std::cout << "registering: " << type;
        return type;
    }
};

template<typename T>
struct A {
    static int i;
};

template<typename T>
int A<T>::i = Registry::registerType(9);

int main() {
    std::cout << A<int>::i << std::endl;    
}
Run Code Online (Sandbox Code Playgroud)

根据地址消毒剂,叮当声崩溃是由于:

ASAN:DEADLYSIGNAL
=================================================================
==31334==ERROR: AddressSanitizer: SEGV on unknown address 0xffffffffffffffe8 (pc 0x7f5cc12b0bb6 bp 0x7ffdca3d1a20 sp 0x7ffdca3d19e0 T0)
==31334==The signal is caused by a READ memory access.
    #0 0x7f5cc12b0bb5 in std::ostream::sentry::sentry(std::ostream&) …
Run Code Online (Sandbox Code Playgroud)

c++ static ostream

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

实现 Pair with C++20 概念的概念

要打印任何类型,std::pair我们可以实现以下方法:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是假设我们要实现一个方法,可以打印任何类型的对,不一定是std::pair,基于以下要求:

  • 它有 afirstsecondpublic 字段
  • 它有 afirst_typesecond_typepublic 内部类型
  • first== 的类型first_type
  • second== 的类型second_type

有一个concept,我们称之为Pair,可以允许编写一个方法,如:

void printPair(const Pair auto& p) {
    std::cout << p.first << ", " << p.second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这样的一个怎么concept定义?

c++ c++-concepts c++20

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

if constexpr 中的 requires 子句问题

同时努力实现if constexprrequires clause基于如果constexpr和要求,表达了即席概念检查面临着以下问题:

template<class P>
concept TuplePair = requires(P p) {
    requires std::tuple_size<P>::value == 2;
    std::get<0>(p);
    std::get<1>(p);
};

void print(const auto& p) {
    if constexpr( TuplePair<decltype(p)> ) {
        std::cout << std::get<0>(p) << ", " << std::get<1>(p) << std::endl;
    }
    else {
        std::cout << "else" << std::endl;
    }
}

int main() {
    // justifiably prints 'else':
    print(std::make_tuple(3, 4, 5));

    // prints 'else' even though this is a valid TuplePair:
    print(std::make_tuple(1, 2));
}
Run Code Online (Sandbox Code Playgroud)

有什么问题if constexpr …

c++ c++-concepts c++20 if-constexpr

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

使用函数重载解析的概念(而不是 SFINAE)

试图向 SFINAE 说再见。

是否可以使用concepts来区分函数,以便编译器可以根据发送的参数是否满足concept约束来匹配正确的函数?

例如,重载这两个:

// (a)
void doSomething(auto t) { /* */ }

// (b)
void doSomething(ConceptA auto t) { /* */ }
Run Code Online (Sandbox Code Playgroud)

因此,当被调用时,编译器会在每次调用时匹配正确的函数:

doSomething(param_doesnt_adhere_to_ConceptA); // calls (a)
doSomething(param_adheres_to_ConceptA); // calls (b)
Run Code Online (Sandbox Code Playgroud)

相关问题:Concepts 会取代 SFINAE 吗?

c++ sfinae overload-resolution c++-concepts c++20

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

否定和德摩根定律不是 C++20 部分按约束排序的一部分

约束偏序的规则是指AND和OR,但不指NOT:

13.5.4 Partial ordering by constraints [temp.constr.order]
(1.2) ...
- The constraint A ? B subsumes A, but A does not subsume A ? B.
- The constraint A subsumes A ? B, but A ? B does not subsume A.
Run Code Online (Sandbox Code Playgroud)

这些规则基于原子约束约束规范化的定义:

13.5.3 Constraint normalization [temp.constr.normal]
1 The normal form of an expression E is a constraint that is defined
  as follows:
(1.1) The normal form of an expression ( E ) is the normal …
Run Code Online (Sandbox Code Playgroud)

c++ demorgans-law language-lawyer c++-concepts c++20

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

C++20 `constinit` 可以放弃对漂亮计数器习惯用法的需要吗?

C++20 的引入constinit是为了避免静态初始化顺序惨败。

可以放弃对漂亮计数器习惯用法constinit的需要(例如,初始化)吗?std::cout

c++ static-order-fiasco c++20 constinit

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

打破一个 TU 内的 ODR?

以下代码编译时没有任何错误,但它似乎破坏了 ODR:

#include <iostream>

template<long Num>
class B;

template<long Num>
struct A {
    template<long Num1>
    friend void ffoo(A<Num1> a, B<Num>* = nullptr) {
        std::cout << "@A ffoo(A<" << Num1 << ">, B<" << Num << ">*)" << std::endl;
    }
};

template<long Num>
class B {
public:
    friend void ffoo(A<Num> a, B<Num>* = nullptr) {
        std::cout << "@B ffoo(A<" << Num << ">, B<" << Num << ">*)" << std::endl;
    }
};

int main() {
    ffoo(A<1>{});         // @A ffoo(A<1>, …
Run Code Online (Sandbox Code Playgroud)

c++ templates one-definition-rule friend-function language-lawyer

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

GCC:'std::is_same_v&lt;int, T&gt;' 在常量表达式中不可用

尝试实现以下代码

template <typename R, typename V>
concept SizedRangeOf = 
    std::ranges::sized_range<R> &&
    std::same_as<std::ranges::range_value_t<R>, V>;

template<typename T>
const SizedRangeOf<T> auto getView(std::vector<T>& vec) {
    // helper class
    class vector_view {
        std::vector<T>& vec;
    public:
        vector_view(std::vector<T>& vec): vec(vec) {}
        auto begin() const { return vec.begin(); }
        auto end() const { return vec.end(); }
        std::size_t size() const { return vec.size(); }
    };
    return vector_view { vec };
}

int main() {
    std::vector<int> v = {1, 3, 5};
    auto r = getView(v);
    v.push_back(7);
    for(auto val: …
Run Code Online (Sandbox Code Playgroud)

c++ type-traits c++-concepts c++20

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

使用 Firebase 自定义电子邮件验证成功页面

我正在使用默认的 Firebase 函数生成电子邮件验证。默认的电子邮件验证成功页面如下所示:

图像

我想自定义电子邮件验证成功后的响应页面。有没有办法做到这一点?

email-verification firebase firebase-authentication

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