标准如何定义在评估if条件表达式时构造的临时对象的生命周期?
我查找了这些信息,并在一个例子中找到了类似的东西,在第10页的1.9美元中指出[10].(我在这里指的是新规范的最终草案.)但对我来说还是不太清楚(足够)因为Visual C++的行为不同于我对该例子的理解,所以我决定问一下.
请提供适当的规格参考.
如果你将对象命名为整个对象if(那么true块和false块都会存在,但在if结束前会被销毁).
例如:
if ( MyClass x = f() ) { /* ... */ } else { /* ... */ }
nextInstruction();
Run Code Online (Sandbox Code Playgroud)
x可以在两个if块中使用但在nextInstruction被调用之前被销毁.
但如果你不说出来怎么办?
if ( f() ) { /* ... */ } else { /* ... */ }
nextInstruction();
Run Code Online (Sandbox Code Playgroud)
在我对规范的引用部分的理解中,返回的值f()将在执行进入其中一个块(for true或for false)之前被销毁.
但是,Visual C++会破坏该临时对象,就像它被命名一样.(编辑:正如Tino Didriksen所指出的,Visual C++在这里运行良好.现在我确实也确认了.在查看初始测试结果时我肯定犯了错误!)
这在某些边缘情况下很重要(不要在这里讨论它们有多可能或者以这种方式编写代码是否合适......).
例如,让我们:
class ScopedLock {
public:
  ~ScopedLock() { …Run Code Online (Sandbox Code Playgroud) 在C++中有没有办法确定可调用对象的函数签名?
考虑以下:
template< typename F >
void fun(F f)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)
让我们假设fun只用可调用的"东西"来调用它.
在里面fun我想知道什么是功能的签名f.这应该适用于函数指针,引用,包装器,lambdas,绑定,函数对象(假设它们只有一个operator ())等等.我受限于Visual Studio 2010 SP 1,但即使不使用该编译器,我也对标准解决方案感兴趣.
(函数签名Return_Type ([Arg1_Type [, Arg2_Type [, ... ] ] ]);与std::function/ boost::function.相同)
知道至少返回值的部分解决方案具有f一定的价值.(我已经尝试std::result_of但无论如何都无法让它工作.)
有没有精确的 makefile语法定义?或者至少是一些常见的子集,因为我猜有一些风味.这种语法可用于编写解析器.
GNU Make手册似乎并不那么精确.需要一些猜测和反复试验才能根据该文档为makefile编写解析器.
我还在ANTLR邮件列表上找到了类似的问题.但它仍然没有答案,这表明答案......
寻找在我的二进制文件(准确地说.so)中查看特定函数的生成汇编程序的方法,就像我在Compiler Explorer上看到类似的那样,我发现了How to disassemble one single function using objdump? 并根据那里的答案(以及我的进一步搜索)我最终使用了以下命令:
objdump --wide --no-address --no-show-raw-insn [--demangle] --disassemble="<symbol>" -- "<binary>"
Run Code Online (Sandbox Code Playgroud)
<symbol>我发现使用的地方:
objdump --syms [--demangle] -- "<binary>" | grep <function>
Run Code Online (Sandbox Code Playgroud)
其中,the 又<function>是我感兴趣的 C++ 函数名称。当然,the<symbol>是一个损坏的名称。(为了完整起见,我得到了两个结果 - 一个是预期的结果,另一个是带.cold后缀的结果,由“主结果”使用。)
结果已经很扎实了。然而,浏览objdump选项后我看到了有希望的选项:
-C/ --demangle,-l/ --line-numbers,-S/ --source。但是,我无法让他们工作......
INITIAL:第一个 ( -C/ --demangle) 导致根本不打印任何反汇编代码。如果没有它,在该Disassembly of section .text:行之后我会有一行带有符号的行,后跟反汇编。使用此选项时,不会显示符号和反汇编,而是Disassembly of section .fini: …
我使用Git导入了SVN存储库:
git svn clone --preserve-empty-dirs --stdlayout svn+ssh://... SVN.git
Run Code Online (Sandbox Code Playgroud)
它最终确实取得了成功,虽然它在几次失败的情况下失败并且我不得不"重新启动"
git svn fetch
Run Code Online (Sandbox Code Playgroud)
然而,最终似乎一切都很好.(虽然现在写作时我开始怀疑我是否应该提供--preserve-empty-dirs额外的fetches?编辑: 不,我不应该.请看我的评论.)
然后我想创造.gitignore,所以我做了
git svn create-ignore
Run Code Online (Sandbox Code Playgroud)
这也成功了.
但最终的结果并不令人满意.它确实.gitignore在许多文件夹中生成了大量文件.似乎每次SVN都有svn:ignore属性时Git创建了相应的.gitignore文件.
虽然我想将它们合并到一个根.gitignore文件中.这可以通过git实现,因为它更加灵活,忽略允许在带有通配符(或没有通配符)的子目录中忽略.无论如何,我认为可以在根处自动将这些"子.gitignore"转换为单个"子".
而且我想拥有它,因为"SVN人"对我承诺超过二十个.gitignore文件感到不满意......
就在最近,我了解到你可以使用类似函数类型的变量语法来声明一个函数(包括方法):
using function_type = int (double);
// pre-C++11:
//typedef int function_type(double);
function_type fun_global;
struct methods
{
    static function_type mem_fun_static;
    function_type mem_fun_normal;
    virtual function_type mem_fun_virtual;
    virtual function_type mem_fun_abstract = 0;
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中
fun_global 是一个全球性的功能,mem_fun_static是一个static成员函数,mem_fun_normal 是一种普通的方法,mem_fun_virtual是一种virtual方法,mem_fun_abstract 是一种抽象的方法.所有这些都采用单一的类型参数double和返回int值 - 就像function_type说的那样.
这些年来我都知道C++而且我不知道这个 - 这种语言永远不会让我感到惊讶!顺便说一下 - 这里提到的语法是什么?我没看到这个......
然而,在探索这个新功能时,我偶然发现编译器之间存在一些不一致之处.对于测试,我使用以下编译器:
g++ -Wall -Wextra -pedantic -std=c++14clang++ -Wall -Wextra -pedantic -std=c++14cl /W4 …我现在正在从VS 2005迁移到VS 2010,产品包含很少的解决方案,每个解决方案都有很多项目.我想利用属性表系统,因此我们的众多配置将更容易维护.
其中一个问题是我们想要使用Windows SDK 7.1(因为我们需要BaseClasses示例 - 如果我们必须使用该示例,为什么不使用整个SDK)?但这需要我在所有解决方案中的每个项目上更改PlatformToolset.此外,我们必须记住为新添加的项目更改该值.相当糟糕的主意.
所以我想从自定义属性表中设置它(以及其他内容).在属性表上设置属性时,直接从显示的对话框中没有这样的选项.手动将条目添加到XML文件也没有帮助(但我还没有看到任何错误或警告消息).
那我该如何设置默认的PlatformToolset值呢?最好在可以提交到存储库的配置文件中.但如果它可以在某些计算机本地设置中完成,那么它也是可以接受的.
(请注意,我知道我可以使用不同的BaseClasses并完全避免这个问题,但我认为这本身就是一个有趣的问题.)
我也在MSDN Formus上问了这个问题.
如何跳过更新一些子绑定MultiBinding?我已经在代码隐藏中定义了(我在XAML中遇到了一些麻烦,我觉得这不重要 - 毕竟代码隐藏不是那么表达,而是XAML)a MultiBinding需要两个只读属性和一个普通属性产生单一价值.如果ConvertBack不修改只读属性(它们维持其值)并且仅更改普通属性.
虽然定义了MultiBinding整个MultiBinding被设置为TwoWay特定的子绑定设置适当(前两个到OneWay第三个TwoWay).
问题出现在我自己的控件中.然而,为了便于演示,我将其简化为较小的控件.此示例中显示Slider的控件是类似控件,允许选择[0.0; 1.0]范围.所选值由拇指表示并显示为a DependencyProperty.
基本上,控制是由1行x 3列构建的,Grid其中拇指位于中间列中.要正确定位拇指,左列必须指定与所选位置对应的宽度.然而,这个宽度还取决于整个控件的实际宽度和拇指本身的实际宽度(这是因为位置是[0.0; 1.0]范围内的相对值).
移动拇指时,应适当更新位置,但拇指宽度和控制宽度显然不会改变.
代码按预期工作,但是在拇指移动期间在IDE中运行时,当MultiBinding尝试将值设置为这两个只读属性时,"输出"窗口会混乱出现异常信息.我怀疑它没有害处,但有点烦人和误导.并且它意味着代码执行其他事情然后我希望它做,因为我不想设置这些属性(这在他们不是只读的情况下很重要,这实际上会修改它们).
MultiBinding 备注部分中的文档提到允许单个子绑定覆盖MultiBinding模式值,但它似乎不起作用.
也许这可以通过以某种方式表达对控件和拇指宽度(只读属性)的依赖性以某种方式解决.例如,单独注册其通知并在更改时强制执行更新.然而,这对我来说似乎并不自然.MultiBinding另一方面,因为所有左列宽度确实取决于这三个属性.
这是示例XAML代码.
<UserControl x:Class="WpfTest.ExampleUserControl"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <Grid>
  <Grid.RowDefinitions>
   <RowDefinition />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
   <ColumnDefinition x:Name="leftColumn" />
   <ColumnDefinition x:Name="thumbColumn" Width="Auto" />
   <ColumnDefinition />
  </Grid.ColumnDefinitions>
  <!-- Rectangle used in the left column for better visualization. -->
  <Rectangle Grid.Column="0">
   <Rectangle.Fill>
    <LinearGradientBrush …Run Code Online (Sandbox Code Playgroud) 在使用Visual Studio 2017(准确地说是15.5.6)中的Visual C ++玩耍时,我注意到__PRETTY_FUNCTION__GCC似乎起作用了!-至少在某种程度上……
但是使用编译代码会__PRETTY_FUNCTION__导致错误:
error C2065: '__PRETTY_FUNCTION__': undeclared identifier
Run Code Online (Sandbox Code Playgroud)
因此,有什么方法可以使其在Visual C ++中运行?也许包括一些?还是一些特殊的编译设置?(我认为我使用的是默认值。)为什么在所示示例中有效,但在实际使用中无效?
请注意,我不是在寻找Visual C ++替代品__PRETTY_FUNCTION__。我已经知道了 我对这里的行为感到惊讶和好奇。
我正在探索GCC使用该gcc -Q --help=warning语法提供的警告。(有关此内容的更多信息,请参见3.2选项控制输出的种类。)
我想到的是,许多警告(使用GCC版本6.4.1的250中有109个)未分类为C ++。我的意思是,当执行受限查询时,它们不会出现gcc -Q --help=warning,c++。(出于好奇,有81条警告既未分类为C ++也未分类为C。)
但是,至少其中一些警告确实在C ++中起作用。举个例子-Waggregate-return。(在Compiler Explorer上查看)。
在-Waggregate-return默认情况下禁用,我知道这可能是没有多大用处呢(见在问候的-Waggregate回报的目的/行为的混乱呢?)。但是,这只是一个示例,在相同情况下的那些109中也许有一些有用的标志。
那么,为什么有些GCC警告标志不属于C ++语言,但可以在C ++中工作?这是什么规则?