我正在学习 C++17decltype(auto)非类型模板参数的新功能。我写了一个简单的代码片段如下:
#include <type_traits>
template<decltype(auto) arg>
struct Foo {};
int
main()
{
constexpr int x = 42;
static_assert(std::is_same_v<Foo<42>, Foo<x>>);
}
Run Code Online (Sandbox Code Playgroud)
据我了解,Foo<42>应该与Foo<x>.
但是,该static_assert语句使用 clang++、MSVC 19.27 编译,但使用 GCC 10.2、MSVC 19.25 编译失败。
我的问题是:为什么编译器的行为不同?标准对此有何评论?
链接到编译器资源管理器:
铛++ https://godbolt.org/z/66M695
gcc https://godbolt.org/z/3v5Mhd
MSVC 19.25 https://godbolt.org/z/qP6v89
MSVC 19.27 https://godbolt.org/z/14aK5Y
在摆弄复制省略时,我遇到了这种奇怪的行为:
class Obj {
public:
Obj() = default;
Obj(Obj&&) = delete;
Obj(const Obj&) { std::cout << "Copy" << std::endl; }
};
Obj f1() {
Obj o;
return o; // error C2280: move constructor is deleted
}
Obj f2() {
Obj o;
return Obj(o); // this however works fine
}
int main() {
Obj p = f1();
Obj q = f2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC 和 Clang 接受此代码并且能够在两种情况下使用复制省略。
在f1()MSVC 中抱怨它无法返回,o因为Obj删除了 的移动构造函数。但是,我希望它能够依靠复制构造函数。这是 MSVC 中的错误还是这种期望的行为(我不明白)和 GCC/Clang …
我尝试在 Macbook pro 上使用 PyTorch 训练模型。它采用新一代苹果M1 CPU。但是,PyTorch 无法识别我的 GPU。
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
IPU available: False, using: 0 IPUs
Run Code Online (Sandbox Code Playgroud)
有谁知道有什么解决办法吗?
我已将所有库更新到最新版本。
我正在尝试移植一些为 GCC (8.2) 编写的代码以供 Clang 编译:
#include <tuple>
struct Q{};
using TUP = std::tuple<Q>;
template<typename Fn>
inline
void feh(Fn&, const std::tuple<>*)
{}
template<typename Fn, typename H>
inline
void feh(Fn& fn, const std::tuple<H>*)
{
fn(H{});
}
template<typename Fn, typename H, typename... R>
inline
void feh(Fn& fn, const std::tuple<H, R...>*)
{
fn(H{});
using Rest = const std::tuple<R...>*;
feh<Fn, R...>(fn, static_cast<Rest>(nullptr));
}
template<typename Tuple, typename Fn>
inline
void fe(Fn& fn, const Tuple * tpl = nullptr)
{
feh(fn, tpl);
}
int main()
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 c++20 约束算法用于擦除删除习语:
std::vector<int> v;
v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));
Run Code Online (Sandbox Code Playgroud)
但是当我做一个简单的转换时:
v.erase(std::ranges::unique(v), std::end(v));
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,参数erase不匹配:
error: no matching function for call to 'std::vector<int>::erase(std::ranges::borrowed_subrange_t<std::vector<int>&>, std::vector<int>::iterator)'
Run Code Online (Sandbox Code Playgroud)
如果第二个参数是 ,则会产生类似的错误std::ranges::end(v)。
我怎样才能让它发挥作用?
该问题最初使用remove而不是unique,但是std::erase所有容器都过载了,这使得该特定用例的动机降低。
我想通过尝试解决一个困难的“嵌套条件”问题来考虑以下代码:
goto error;
if (false)
{
error:
cout << "error block" << endl;
}
else
{
cout << "else block" << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,仅error block按预期显示(我猜?)。但这是所有编译器都定义的行为吗?
template<class T>
void fun(T){}
template<>
int fun(int){return 0;}
Run Code Online (Sandbox Code Playgroud)
考虑这个例子,它被所有实现拒绝。但是,我在当前标准中没有发现任何有说服力的条款来指定这种显式专业化声明的格式不正确。如果存在的话,规则是什么?
此外,潜在的相关规则可能是[temp.deduct.decl#2]
如果对于如此考虑的一组函数模板,在考虑部分排序后没有匹配或有多个匹配([temp.func.order]),则推导失败,并且在声明情况下,程序有问题-形成。
我认为“匹配”的含义在这里还不够明确,因为“匹配”没有明确定义任何内容。
在 C++20 中,某些范围同时具有const和 non- const begin()/end(),而其他范围仅具有 non- const begin()/end()。
为了使包装前者的范围适配器能够begin()/end()在合格时使用const,一些范围适配器如elements_view、reverse_view和common_view都提供了 constrainedconst合格的begin()/end()函数,例如:
template<view V>\n requires (!common_\xc2\xadrange<V> && copyable<iterator_t<V>>)\n class common_view : public view_interface<common_view<V>> {\n public:\n constexpr auto begin();\n constexpr auto end();\n\n constexpr auto begin() const requires range<const V>;\n constexpr auto end() const requires range<const V>;\n};\n\ntemplate<input_\xc2\xadrange V, size_t N>\n requires view<V> && has-tuple-element<range_value_t<V>, N>\nclass elements_view : public view_interface<elements_view<V, N>> {\n public:\n constexpr …Run Code Online (Sandbox Code Playgroud) 所以我读了关于constexpr 和 const 之间有什么区别的有趣答案,但我很好奇 #define 和 constexpr 之间有什么区别?我觉得 constexpr 只是一个可以选择类型的#define。
正如关键字constexpr所暗示的const,它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constexpr?
c++ ×9
c++11 ×2
c++17 ×2
c++20 ×2
constexpr ×2
std-ranges ×2
apple-m1 ×1
constants ×1
copy-elision ×1
goto ×1
gpu ×1
macros ×1
pytorch ×1
templates ×1
visual-c++ ×1