下面的代码段在 vc++ 和 clang++ 中编译得很好,但在 gcc (inc 9.2) 上失败,除非我添加一个显式的强制转换。哪个编译器就在这里?
#include <initializer_list>
template<typename T>
void Task(void) {}
int main()
{
for(auto p_task: {&Task<int>}) {} // error
// for(auto p_task: {static_cast<void (*)(void)>(&Task<int>)}) {} // ok
}
Run Code Online (Sandbox Code Playgroud)
#include <initializer_list>
template<typename T>
void Task(void) {}
int main()
{
for(auto p_task: {&Task<int>}) {} // error
// for(auto p_task: {static_cast<void (*)(void)>(&Task<int>)}) {} // ok
}
Run Code Online (Sandbox Code Playgroud)
c++ templates initializer-list template-argument-deduction c++17
我们有2种方法在仅头文件库中声明函数.他们是inline
和 template<class = void>
.在boost
源代码中,我可以看到两种变体.示例如下:
inline void my_header_only_function(void)
{
// Do something...
return;
}
template<class = void> void my_header_only_function(void)
{
// Do something...
return;
}
Run Code Online (Sandbox Code Playgroud)
我知道根据C++标准有什么区别.但是,任何C++编译器都不仅仅是标准的,而且标准也经常不清楚.
在从不使用模板参数且与递归可变参数模板无关的情况下,主流编译器的两个变体之间是否存在(以及什么)实际差异?
该标准规定了这一点
如果占位符是
decltype(auto)
类型说明符,T
则应仅为占位符.
decltype(auto)*x7d = &i;
//错误,声明的类型不明白decltype(auto)
目前尚不清楚是否仍然允许使用cv-qualifiers.如果他们被允许将是有道理的.编译器似乎在这个问题上存在分歧.以下代码被g ++接受但被clang ++拒绝,vc ++似乎根本不支持decltype(auto)
变量:
int main()
{
const decltype(auto) sz_text{"test"};
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来自动使默认模板参数在每次实例化模板时都是唯一的.由于lambda表达式创建的未命名函数对象具有不同的类型,我想以某种方式采用它们.随着标准愚蠢删除的最近更改"一个lambda表达式不会出现在......模板参数中"限制(参见未评估上下文中的lambdas的措辞),这似乎是一个好主意.所以我编写了以下有点编写最近gcc和clang的工作片段:
#include <type_traits>
template<void ( * ) (void) = [](){}> class
unique final {};
static_assert(false == ::std::is_same_v<unique<>, unique<>>);
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一种可行的方法还是其中一种"形成不良,无需诊断"的案例?
一些额外的上下文:我想使用它来实现Ada样式的强类型定义,这些定义应该在单个翻译单元中工作,而无需手动发明未使用的唯一标记:
struct _tag_WowInt {};
using Int = type<int, _tag_WowInt>;
struct _tag_SoUnique {};
using DifferentInt = type<int, _tag_SoUnique>;
Run Code Online (Sandbox Code Playgroud)
Upd1:我想提一下,涉及__COUNTER__
或类似宏的方法在一般情况下不起作用,因为它们只会被预处理器扩展一次,并且在模板内部使用时不会产生唯一类型.
标准库中的许多算法接受带有签名的一元谓词,bool (Type & item)
因此直接提供指向非静态成员函数的指针不起作用.考虑到通过调用替换operator ()
对谓词的直接调用似乎可以解除这种限制,这似乎是相当严格的std::invoke
.也许提出的方法有一些我忽略的缺点?
注意:此问题中引用的非静态成员函数应该与常规函数谓词不同,只是因为项引用作为隐式参数而不是显式参数传递.
示例代码(在线编译器):
#include <array>
#include <algorithm>
#include <iostream>
#include <functional>
#include <cassert>
template<typename TForwardIterator, typename TPredicate> TForwardIterator
vtt_find_if
(
const TForwardIterator p_items_begin
, const TForwardIterator p_items_end
, TPredicate && predicate
)
{
TForwardIterator p_item(p_items_begin);
// while((p_items_end != p_item) && (!predicate(*p_item)))
while((p_items_end != p_item) && (!::std::invoke(predicate, *p_item)))
{
++p_item;
}
return(p_item);
}
class t_Ticket
{
private: int m_number;
public:
t_Ticket(const int number): m_number(number) {}
public: bool
Is_Lucky(void) const …
Run Code Online (Sandbox Code Playgroud) 我将 Visual Studio 与 C++ 一起使用。键入单词时,visual studio 会按预期提出建议,但并不总是突出显示它们。这就是我的意思:
我输入“stri”,“string”被突出显示,这让我可以按回车键并完成单词。
然后,如果我只删除语句的一部分,它不再突出显示字符串,
最后,最重要的是,如果我想在其他地方使用该字符串,它不会突出显示名称。
在示例中,您可以看到按 Enter 键会转到新行而不是完成单词。按 tab 会起作用,但是它仍然没有突出显示我不喜欢的单词,而且我习惯于按 enter,所以我不想按 tab。
我想弄清楚如何让 Skia 从路径几何中生成网格。我已经检查过SkPath::dump
, SkPath::writeToMemory
, SkPath::serialize
,但是它们似乎都输出路径内容而不是网格。
注意:网格是指由路径形状的细分生成的三角形网格,以后可以使用非矢量图形 API 进行渲染,例如 OpenGL / Vulkan。类似于ID2D1Geometry::Tessellate
.
请考虑以下代码:
#include <iostream>
struct Thing
{
Thing(void) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
Thing(Thing const &) = delete;
Thing(Thing &&) = delete;
Thing & operator =(Thing const &) = delete;
Thing & operator =(Thing &&) = delete;
};
int main()
{
Thing thing{Thing{}};
}
Run Code Online (Sandbox Code Playgroud)
我希望Thing thing{Thing{}};
声明意味着临时对象的建设Thing
使用默认的构造函数和建设类thing
的对象Thing
使用仅仅用创建的临时对象作为参数转移构造类.我希望这个程序被认为是不正确的,因为它包含一个被删除的移动构造函数的调用,即使它可能被省略.标准的class.copy.elision部分似乎也要求这样做:
即使呼叫被省略,也必须可以访问所选的构造函数
通过简化值类别保证复制省略的措辞似乎也不允许.
然而gcc 7.2(以及clang 4也是如此,但VS2017 仍然不支持保证复制省略)将编译此代码,只需移动构造函数调用即可.
在这种情况下哪种行为是正确的?
我找不到在Visual Studio 2017中启动HLSL调试器的选项.
Microsoft文档指示从Graphics Pipeline Stages窗口或Graphics Pixel History启动它
https://msdn.microsoft.com/en-us/library/hh873197.aspx
但是,我不知道它们是什么或如何到达它们
当我直接在visual studio IDE中的hlsl代码中设置断点时,它只会The Breakpoint will not currently be hit
在空的红色圆圈上显示" ".我假设我需要在hlsl调试器中打开hlsl代码,以便它在行中断开.
我正在DirectX 11 App(Universal Windows)
x64调试模式下运行一个新的项目模板,并在顶点和像素着色器中设置断点.
谢谢,
c++ ×9
c++17 ×4
templates ×2
algorithm ×1
auto ×1
autocomplete ×1
autosuggest ×1
c++20 ×1
constructor ×1
copy-elision ×1
decltype ×1
directx ×1
hlsl ×1
lambda ×1
skia ×1
template-argument-deduction ×1
windows-10 ×1