void*在标准的至少某些版本中,不允许使用type的非类型模板参数。
这是真的?如果为真,则在哪些版本的标准中void*不允许使用非类型模板参数?
(注意:正如在
回答
另一个评论的评论中所指出的
,这是关于非类型模板参数,而不是模板类型参数,模板参数可以是每个
[temp.arg.type]的有效type-id,包括。void*
我试图在内部lambda中捕获一个可变参数的lambda参数,并在其中使用它。例如,考虑以下代码:
int main () {
auto first = [&] (auto&&... one) {
auto second = [&] (auto&&... two) {
return ((one * two) + ...);
};
return second(one...);
};
return first(5);
}
Run Code Online (Sandbox Code Playgroud)
这适用于gcc9,但不适用于clang8(https://godbolt.org/z/i2K9cK)。
使代码编译的一种方法是显式捕获[&one...],但是我想知道这是否是clang中的错误。
也很有趣:将return语句更改one为直接扩展的内容(与结合之前two),然后再次编译:
return (((one * ...) * two) + ...);
我找到了这个相关的帖子,但是声明在那里的错误似乎在clang8中已修复。
我最近写了一个STL Vector的实现作为编程练习.该程序编译但我收到一个奇怪的错误说:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Run Code Online (Sandbox Code Playgroud)
我以前从来没有想过这个错误,也不确定在我的实现中究竟应该改变什么才能使它正常运行.
有人可以查看我的代码,看看在这个特定情况下是否有任何东西突然出现错误?对不起,我不能更具体,我不知道在哪里看自己,提前谢谢.
#include <iostream>
#include <string>
#include <cassert>
#include <algorithm>
using namespace std;
template <class T>
class Vector
{
public:
typedef T * iterator;
Vector();
Vector(unsigned int size);
Vector(unsigned int size, const T & initial);
Vector(const Vector<T> & v);
~Vector();
unsigned int capacity() const;
unsigned int size() const;
bool empty() const;
iterator begin();
iterator end();
T & front();
T & back();
void push_back(const T & value);
void pop_back(); …Run Code Online (Sandbox Code Playgroud) Java 的 getOrDefault 是一个很好的构造,可以单行访问映射值或起点(如果不存在)。我在 C++ 的地图参考中没有看到任何并行的内容。是否存在某些东西或者是您自己构建的?
我在地图中有对象,如果它们存在,我会更新它们,但如果它们不存在,我会构造新的。使用 getOrDefault,我可以在默认端构造对象,或者访问它(如果存在)。
http://www.cplusplus.com/reference/map/map/
https://www.geeksforgeeks.org/hashmap-getordefaultkey-defaultvalue-method-in-java-with-examples/
我意识到这可能是一个愚蠢的问题,但我无法在任何地方找到答案...... C++函数中'&'符号的目的是什么?如
vec2& operator+(vec2& left, const vec2& right)
{
return left.add(right);
}
Run Code Online (Sandbox Code Playgroud)
我正在关注一个有点超过我的youtube系列,但我做得很好,因为所有代码都在那里.然而,'和'符号不断涌现,我真的想知道它是什么......它与课程有关吗?
这正是我正在观看的内容:https://www.youtube.com/watch?v = -peYVLeK0WU来自名为"TheChernoProject"的频道制作一个简单的游戏引擎的家伙.此外,这是Visual Studio 2013 C++,如果它改变任何东西.
在https://en.cppreference.com/w/cpp/regex/regex_traits/transform_primary中,提出了以下示例代码段:
#include <iostream>
#include <regex>
int main()
{
std::locale::global(std::locale("en_US.UTF-8"));
std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
std::wregex re(L"[[=a=]]*", std::regex::basic);
std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
也有人说应该输出true。但是,始终在Debian上使用GCC 8和Clang 7以及macOS High Sierra随附的Clang进行尝试false(您可以使用cppreference页面中的“运行”按钮直接进行测试)。
有人可能会说cppreference页面是错误的,这肯定是可能的,但是在阅读文档时,对我来说似乎true也是正确的输出:str据我所知,字符串中的所有字符都在的主要整理类中a。
所以问题是:谁是对的?编译器还是cppreference?又为什么呢?
例如,我有一个自定义类型
struct custom_type
{
double value;
};
Run Code Online (Sandbox Code Playgroud)
我想为此类型设置自定义FMT格式器。我执行以下操作,并且有效:
namespace fmt
{
template <>
struct formatter<custom_type> {
template <typename ParseContext>
constexpr auto parse(ParseContext &ctx) {
return ctx.begin();
};
template <typename FormatContext>
auto format(const custom_type &v, FormatContext &ctx) {
return format_to(ctx.begin(), "{}", v.value);
}
};
Run Code Online (Sandbox Code Playgroud)
但是问题是,输出格式是由带有此"{}"表达式的模板代码设置的。我想给用户一个机会自己定义格式字符串。
例如:
custom_type v = 10.0;
std::cout << fmt::format("{}", v) << std::endl; // 10
std::cout << fmt::format("{:+f}", v) << std::endl; // 10.000000
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
目前,当我设置自定义格式字符串时,
what(): unknown format specifier
Run Code Online (Sandbox Code Playgroud) 当你将键盘框架拖离屏幕时,我正在画一个关于如何获得键盘框架的空白.我知道如何使用UIKeyboardWillShowNotification,UIKeyboardWillChangeFrameNotification,UIKeyboardDidChangeFrameNotification开始或结束动画,但是当你将它拖离屏幕时我正在寻找持续更新.例如,我想知道键盘的框架在此拖动点的位置

我正在尝试使用键盘框架来调整桌面视图,该视图应该在向下拖动时正对着键盘.
任何帮助,将不胜感激.
谢谢,
韦斯
When using placement new in generic code to construct an object at a specified address, the usage pattern is a bit different from usual code. For example, consider this implementation of uninitialized_copy: ([uninitialized.copy])
template <class It, class For>
For uninitialized_copy(It first, It last, For dest)
{
using T = typename std::iterator_traits<For>::value_type;
for (; first != last; ++first, (void)++dest)
::new (static_cast<void*>(std::addressof(*dest))) T(*first);
}
Run Code Online (Sandbox Code Playgroud)
This post addresses the following points from the perspective of the standard:
why ::new is …
c++ c++-faq generic-programming placement-new language-lawyer
我认为以下代码格式正确:
template< typename T >
using IsSigned = std::enable_if_t< std::is_signed_v< T > >;
template< typename T, IsSigned< T >... >
T myAbs( T val );
Run Code Online (Sandbox Code Playgroud)
其他人则说它格式错误,因为C ++ 17标准的第17.7(8.3)节:
知道哪些名称是类型名称,就可以检查每个模板的语法。该程序格式错误,无需诊断,如果:(...)可变参数模板的每个有效专业化都需要一个空模板参数包,或者(...)
我认为这IsSigned< T >...是一个依赖的模板参数,因此无法在模板定义时对照§17.7(8.3)进行检查。IsSigned< T >例如可能是voidTs的一个子集,int另一个子集或替换失败。对于void子集,确实是这样,空模板参数包将是唯一有效的专业化,但是int子集可以具有许多有效的专业化。这取决于实际T参数。
这意味着编译器必须在模板实例化之后检查它,因为T之前是未知的。到那时,完整的参数列表是已知的,可变参数为零。该标准规定以下内容(第17.6.3(7)节):
当N为零时,扩展的实例化将生成一个空列表。这样的实例化不会改变封闭结构的句法解释
这就是为什么我认为它的格式正确。