小编fel*_*lix的帖子

为什么const auto&p {nullptr}工作而auto*p {nullptr}不能在C++ 17中工作?

这个定义有效:

const auto &b{nullptr};
Run Code Online (Sandbox Code Playgroud)

虽然失败了:

auto *b{nullptr};
Run Code Online (Sandbox Code Playgroud)

我试图在Visual C++,GCC和Clang中编译它.他们都抱怨"不能推断出类型".

在第二种情况下,不b应该推断出有某种类型的std::nullptr_t

c++ nullptr auto c++17

31
推荐指数
3
解决办法
2105
查看次数

为什么依赖名称可以被认为是完整的,即使实际类型直到最后才定义

考虑这个例子:

template <class T>
void Yeap(T);

int main() {
    Yeap(0);
    return 0;
}

template <class T>
void YeapImpl();

struct X;

template <class T>
void Yeap(T) {
    YeapImpl<X>(); // pass X to another template
}

template <class T>
void YeapImpl() {
    T().foo();
}

struct X {
    void foo() {}
};
Run Code Online (Sandbox Code Playgroud)

请注意,struct X直到最后才定义.我曾经相信所有使用过的名字必须在实例化时完成.但是在这里,编译器如何在定义之前将其视为完整类型?

我已经检查了cppreference中的依赖名称和函数模板实例化的绑定规则和查找规则,但是没有一个能够解释这里发生的事情.

c++ templates dependent-name c++17

9
推荐指数
1
解决办法
255
查看次数

为什么此模板参数推导/重载解析失败?

此代码段无法在MSVC,ClangGcc中编译(它们提供不同的错误消息):

int foo(int a, int b) {
    return a + b;
}

template <class Ret, class A, class B>
void foo(Ret (*)(A, B)) {

}

int main() {
    foo(foo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不应该编译吗?我无法理解为什么它无法解析重载函数或推断模板参数.欢迎任何帮助,谢谢.

PS:如果替换模板void foo(int (*)(int, int)),或者我们重命名模板foo以避免超载,则编译它.

c++ templates language-lawyer overload-resolution

7
推荐指数
1
解决办法
126
查看次数

当提供了operator&lt;重载时,为什么std::tuple比较调用operator bool

#include <tuple>

struct X {
    int i = 0;
    friend constexpr bool operator<(const X &l, const X &r) noexcept {
        return l.i < r.i;
    }
};

struct Y {
    int i = 0;
    constexpr operator bool() const noexcept {
        return i != 0;
    }
    friend constexpr bool operator<(const Y &l, const Y &r) noexcept {
        return l.i < r.i;
    }
};

int main() {
    constexpr X a{1}, b{2};
    static_assert(std::tie(a) < std::tie(b));

    constexpr Y c{1}, d{2};
    static_assert(c < d);
    // assert …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++20

7
推荐指数
1
解决办法
308
查看次数

是否存在成员访问运算符的lhs的评估与其参数的副作用之间的顺序排序关系?

我已经阅读了cppreference 的评估顺序,但我找不到任何与此情况相关的规则.这是否意味着之前没有顺序关系,或者我错过了什么?谢谢.

以下代码段给出了一个示例.

#include <memory>

struct Foo {
  void func(std::unique_ptr<Foo>) {}
};

int main() {
  auto ptr = std::make_unique<Foo>();
  ptr->func(std::move(ptr)); // Is this valid?
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ expression side-effects c++14

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

如何检查成员函数或自由函数是否适用于确切的给定类型(而不是其任何基类)?

检查是否可以在对象上调用成员函数/自由函数的方法是:

#include <type_traits>
#include <utility>

template <class T, class = void>
struct HasMember : std::false_type {};
template <class T>
struct HasMember<T, std::void_t<decltype(std::declval<T>().Foo())>> : std::true_type {};

template <class T, class = void>
struct HasFreeFoo : std::false_type {};
template <class T>
struct HasFreeFoo<T, std::void_t<decltype(Foo(std::declval<T>()))>> : std::true_type {};

struct A { void Foo() {} }; 
struct B : A {};
struct C : B {};
                                          
void Foo(const A &) {}

int main() {
  static_assert(HasMember<C>::value, "");
  static_assert(HasFreeFoo<C>::value, "");
}
Run Code Online (Sandbox Code Playgroud)

但正如示例所示,

  1. CFoo被认为已经A …

c++ template-meta-programming c++17 c++20

3
推荐指数
1
解决办法
244
查看次数