Home > Backend Development > C++ > Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.

Is \'Timer()\' a function or an object? Understanding the \'Most Vexing Parse\' in C 11.

Barbara Streisand
Release: 2024-11-02 15:33:29
Original
762 people have browsed it

Is

Most 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>
Copy after login

Analysis:

In the first line:

<code class="cpp">auto dv = Timer();</code>
Copy after login
  • 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>
Copy after login
  • 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>
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template