


Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.
Nov 02, 2024 pm 03:33 PMMost Vexing Parse Confusion: Clarifying the Ambiguity
In C 11, uniform initializers introduce a subtle ambiguity known as "most vexing parse." Let's delve into an example that demonstrates this issue:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // What is Timer() ? And what type is dv? int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"? return 0; }</code>
Analysis:
In the first line:
<code class="cpp">auto dv = Timer();</code>
- What is Timer()? Timer() is a constructor of the Timer class that takes no arguments. It initializes an object of type Timer.
- What type is dv? dv is declared using auto, which infers its type from the initializer. Since the initializer is of type Timer, dv is of type Timer.
In the second line:
<code class="cpp">int time_keeper(Timer());</code>
- Is this a function? Yes, this is a function declaration. It declares a function called time_keeper that returns an int and takes an argument.
- Why isn't the argument "Timer () ()"? This is a peculiar case of the "most vexing parse" ambiguity. When a function is passed as an argument to another function, it automatically decays to a pointer to the function. So, in this case, the argument is not Timer () (), but rather Timer().
To prove this, consider the following program:
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>
This program compiles successfully, confirming that time_keeper takes a pointer to a function as an argument.
In conclusion, the "most vexing parse" confusion stems from the fact that the expression Timer() can be interpreted as either an object of type Timer or a function pointer to a function that returns a Timer. The correct interpretation depends on the context in which the expression is used.
The above is the detailed content of Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.. For more information, please follow other related articles on the PHP Chinese website!

Hot Article

Hot tools Tags

Hot Article

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

What are the types of values returned by c language functions? What determines the return value?

What are the definitions and calling rules of c language functions and what are the

C language function format letter case conversion steps

Where is the return value of the c language function stored in memory?

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently?

How does the C Standard Template Library (STL) work?
